Wiki Seb35 wiki_seb35 http://wiki.seb35.fr/Accueil MediaWiki 1.37.0-alpha first-letter Média Spécial Discussion Utilisateur Discussion utilisateur Wiki Seb35 Discussion Wiki Seb35 Fichier Discussion fichier MediaWiki Discussion MediaWiki Modèle Discussion modèle Aide Discussion aide Catégorie Discussion catégorie Projet Discussion projet Tutorial Discussion tutorial Présentation Discussion présentation Module Discussion module Accueil 0 1 1 2014-09-03T10:36:23Z MediaWiki default 0 wikitext text/x-wiki '''MediaWiki a été installé avec succès.''' Consultez le [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki. == Pour démarrer == * [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste des paramètres de configuration] * [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ sur MediaWiki] * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki] * [//www.mediawiki.org/wiki/Localisation#Translation_resources Adaptez MediaWiki dans votre langue] e2ba2fe8cdbd5af69eb05374592f01b53785a227 28 1 2014-11-27T15:42:48Z Seb35 1 +pages du wiki pour accès direct wikitext text/x-wiki '''MediaWiki a été installé avec succès.''' Consultez le [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki. == Pour démarrer == * [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste des paramètres de configuration] * [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ sur MediaWiki] * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki] * [//www.mediawiki.org/wiki/Localisation#Translation_resources Adaptez MediaWiki dans votre langue] == Pages du wiki == {{Special:Allpages}} 9d5bf6b276809cea155587b8c42e6eb793459457 Archéo Lex 0 2 2 2014-09-03T21:42:02Z Seb35 1 init wikitext text/x-wiki '''Archéo Lex''' est un de mes projets visant à offrir une visualisation des textes de lois français ''pratique'' et ''jolie'', que je transpose en ''[https://fr.wikipedia.org/wiki/Git Git]'' + ''[https://fr.wikipedia.org/wiki/Markdown Markdown]''. Le dépôt Git du code est sur [https://github.com/Seb35/Archeo-Lex Github], un exemple avec le [https://github.com/Seb35/CPI code de la propriété intellectuelle] y est également disponible ([https://github.com/Seb35/CPI/blob/master/Code%20de%20la%20propriété%20intellectuelle.md dernière version du texte], [https://github.com/Seb35/CPI/commit/50283dda63cef5a45a992d649b4d2ff2b1f7b546 un exemple de modification]) et un [[:blog:billet/Archéo-Lex,-Pure-Histoire-de-la-Loi-française,-pour-étudier-son-évolution|billet de blog introductif]] est disponible sur mon blog. Ci-dessous différentes choses liées au développement. Si vous comptez faire des modifs substantielles, dites-moi un peu en quoi ça consiste et je pourrai vous donner les droits en commit sur Github. Noter que la licence d’Archéo Lex est la [http://www.wtfpl.net/ WTFPL 2.0]. == Roadmap == Réparti en grandes thématiques. Les chiffres (1) (2) définissent une indication de priorité. Lorsque c’est marqué (README), ce point est issu du README Github, le retirer quand c’est résolu. N’hésitez pas à discuter autour de ces points (je peux ouvrir des comptes sur le wiki sur demande). # Prise en compte des mises à jour différentielles de la base LEGI : ## (README) (1) mise à jour des nouvelles versions des textes sans recalcul de l’entièreté de la base ## (README) (2) téléchargement automatique des bases LEGI (et autres) et de leurs mises à jour incrémentales # Étudier les réécritures d’historiques, s’il y en a (si la DILA modifie la base LEGI quand il y a des fautes de retranscription entre ''La Loi'' et ce qui est publié dans la base LEGI) : ## (README) (3) intégration des modifications d’historique (orthographe, typographie, coquilles, etc.) quand les mises à jour le demandent (à étudier) # Problèmes et améliorations mineurs : ## (README) (3) réfléchir à une façon d’intégrer à Git les textes pré-1970 (inféfieurs à l’epoch, refusés par Git, par ex LEGITEXT000006070666) ## (README) (5) mettre les dates de commit à la date d’écriture ou de publication du texte modificateur (à réfléchir) (attention : cette 2e date peut être avant, après ou identique à la date d’entrée en vigueur) pour créer des visualisations intégrant ces différences de dates ## (3) généraliser les interfaces de création de syntaxe (pour implémenter d’autres languages que le Markdown) et d’enregistrement des versions (pour implémenter d’autres cadres de gestion de versions : svn, plusieurs fichiers avec des suffixes par date, hg, etc.) # Qualité : ## (README) (4) vérifier plus en profondeur la qualité des résultats (par exemple dans le code des assurances il y a actuellement une différence vide vers le début) ## (README) (5) écrire la grammaire exacte du sous-ensemble Markdown utilisé et des autres éléments de syntaxe utilisés (cf points 6 et 12) ## (README) (5) documenter plus et mieux ## (README) (4) ajouter des tests unitaires # Interactions et interface utilisateur : ## (README) (4) ajout de branches (orphelines) Git avec liens vers les autres textes (liens soit juste mentionnés en-dessous de l’article comme sur Légifrance, soit au sens Markdown+Git similairement à Légifrance) ## (README) (4) faire expérimenter la syntaxe Markdown et autres éléments de syntaxe à des publics non-informaticiens et réfléchir à l’améliorer (cf points 7 et 12) ## (README) (5) création ou adaptation d’interfaces de visualisation (cf point 16) # Production : ## (README) (6) mise en production d’un service web qui mettrait à jour quotidiennement les dépôts Git ## (README) (6) création d’un site web permettant la visualisation des modifications, proposerait des liens RSS, etc. de façon similaire à La Fabrique de la Loi, à Légifrance, aux sites du Sénat ou de l’Assemblée nationale (cf point 11) # Futur : ## (README) (7) travail sur les autres textes législatifs que les codes (les seuls testés actuellement), comme les Constitutions, les lois, les décrets, etc. ## (README) (7) travail sur les autres bases (KALI pour les conventions collectives, JORF pour le journal officiel -- ce dernier n’a pas de versions à ma connaissance mais demanderait juste à être transformé en Markdown) == Recherche == * [[Syntaxes de formatage léger|Comparaison de syntaxe de formatage léger]] f2ab37a0321deaf3c5fe2801cabd6827a777fe7f 44 2 2014-12-22T14:03:45Z Seb35 1 +cat wikitext text/x-wiki '''Archéo Lex''' est un de mes projets visant à offrir une visualisation des textes de lois français ''pratique'' et ''jolie'', que je transpose en ''[https://fr.wikipedia.org/wiki/Git Git]'' + ''[https://fr.wikipedia.org/wiki/Markdown Markdown]''. Le dépôt Git du code est sur [https://github.com/Seb35/Archeo-Lex Github], un exemple avec le [https://github.com/Seb35/CPI code de la propriété intellectuelle] y est également disponible ([https://github.com/Seb35/CPI/blob/master/Code%20de%20la%20propriété%20intellectuelle.md dernière version du texte], [https://github.com/Seb35/CPI/commit/50283dda63cef5a45a992d649b4d2ff2b1f7b546 un exemple de modification]) et un [[:blog:billet/Archéo-Lex,-Pure-Histoire-de-la-Loi-française,-pour-étudier-son-évolution|billet de blog introductif]] est disponible sur mon blog. Ci-dessous différentes choses liées au développement. Si vous comptez faire des modifs substantielles, dites-moi un peu en quoi ça consiste et je pourrai vous donner les droits en commit sur Github. Noter que la licence d’Archéo Lex est la [http://www.wtfpl.net/ WTFPL 2.0]. <div style="border:1px solid black;padding:0.5em;"> <u>Sous-pages sur Archéo Lex :</u> {{Spécial:Prefixindex/Archéo Lex/}} </div> == Roadmap == Réparti en grandes thématiques. Les chiffres (1) (2) définissent une indication de priorité. Lorsque c’est marqué (README), ce point est issu du README Github, le retirer quand c’est résolu. N’hésitez pas à discuter autour de ces points (je peux ouvrir des comptes sur le wiki sur demande). # Prise en compte des mises à jour différentielles de la base LEGI : ## (README) (1) mise à jour des nouvelles versions des textes sans recalcul de l’entièreté de la base ## (README) (2) téléchargement automatique des bases LEGI (et autres) et de leurs mises à jour incrémentales # Étudier les réécritures d’historiques, s’il y en a (si la DILA modifie la base LEGI quand il y a des fautes de retranscription entre ''La Loi'' et ce qui est publié dans la base LEGI) : ## (README) (3) intégration des modifications d’historique (orthographe, typographie, coquilles, etc.) quand les mises à jour le demandent (à étudier) # Problèmes et améliorations mineurs : ## (README) (3) réfléchir à une façon d’intégrer à Git les textes pré-1970 (inféfieurs à l’epoch, refusés par Git, par ex LEGITEXT000006070666) ## (README) (5) mettre les dates de commit à la date d’écriture ou de publication du texte modificateur (à réfléchir) (attention : cette 2e date peut être avant, après ou identique à la date d’entrée en vigueur) pour créer des visualisations intégrant ces différences de dates ## (3) généraliser les interfaces de création de syntaxe (pour implémenter d’autres languages que le Markdown) et d’enregistrement des versions (pour implémenter d’autres cadres de gestion de versions : svn, plusieurs fichiers avec des suffixes par date, hg, etc.) # Qualité : ## (README) (4) vérifier plus en profondeur la qualité des résultats (par exemple dans le code des assurances il y a actuellement une différence vide vers le début) ## (README) (5) écrire la grammaire exacte du sous-ensemble Markdown utilisé et des autres éléments de syntaxe utilisés (cf points 6 et 12) ## (README) (5) documenter plus et mieux ## (README) (4) ajouter des tests unitaires # Interactions et interface utilisateur : ## (README) (4) ajout de branches (orphelines) Git avec liens vers les autres textes (liens soit juste mentionnés en-dessous de l’article comme sur Légifrance, soit au sens Markdown+Git similairement à Légifrance) ## (README) (4) faire expérimenter la syntaxe Markdown et autres éléments de syntaxe à des publics non-informaticiens et réfléchir à l’améliorer (cf points 7 et 12) ## (README) (5) création ou adaptation d’interfaces de visualisation (cf point 16) # Production : ## (README) (6) mise en production d’un service web qui mettrait à jour quotidiennement les dépôts Git ## (README) (6) création d’un site web permettant la visualisation des modifications, proposerait des liens RSS, etc. de façon similaire à La Fabrique de la Loi, à Légifrance, aux sites du Sénat ou de l’Assemblée nationale (cf point 11) # Futur : ## (README) (7) travail sur les autres textes législatifs que les codes (les seuls testés actuellement), comme les Constitutions, les lois, les décrets, etc. ## (README) (7) travail sur les autres bases (KALI pour les conventions collectives, JORF pour le journal officiel -- ce dernier n’a pas de versions à ma connaissance mais demanderait juste à être transformé en Markdown) == Recherche == * [[Syntaxes de formatage léger|Comparaison de syntaxe de formatage léger]] [[Catégorie:Archéo Lex]] 03e84843dd604d89957bfcb403a02a92e60e23c0 Syntaxes de formatage léger 0 3 3 2014-09-04T12:05:05Z Seb35 1 init wikitext text/x-wiki == Ressources == L’article Wikipédia en anglais "[https://en.wikipedia.org/wiki/Lightweight_markup_language Lightweight markup language]" est bien fait et compare les différentes syntaxes. Autres avis ci et là : * http://dubroy.com/blog/on-wiki-markup-languages/ * http://mojomojo.org/documentation/textile_vs_markdown * http://stackoverflow.com/questions/659227/compare-and-contrast-the-lightweight-markup-languages * http://blog.codinghorror.com/the-future-of-markdown/ * http://fgallaire.flext.net/comparaison-langage-balisage-markup-lightweight-leger-txt2tags-pandoc-docutils-asciidoc-deplate-stx2any-aft-markdown-textile/ * http://www.wilfred.me.uk/blog/2012/07/30/why-markdown-is-not-my-favourite-language/ == Comparaisons == {| class="wikitable" width="100%" |- !Syntaxe !HTML !Markdown !MediaWiki |- |Italique |<code><nowiki><i>italique</i></nowiki></code> |<code><nowiki>_italique_</nowiki></code> |<code><nowiki>''italique''</nowiki></code> |- |Gras |<code><nowiki><b>gras</b></nowiki></code> |<code><nowiki>*gras*</nowiki></code> |<code><nowiki>'''gras'''</nowiki></code> |- |Titre de niveau 1 |<code><nowiki><h1>titre 1</h1></nowiki></code> |<code><nowiki># titre 1</nowiki></code><hr /><code><nowiki># titre 1 #</nowiki></code><hr /><code><nowiki>titre 1</nowiki><br /><nowiki>=======</nowiki></code> |<code><nowiki>= titre 1 =</nowiki></code> |- |Titre de niveau 2 |<code><nowiki><h2>titre 2</h2></nowiki></code> |<code><nowiki>## titre 2</nowiki></code><hr /><code><nowiki>## titre 2 ##</nowiki></code><hr /><code><nowiki>titre 2</nowiki><br /><nowiki>-------</nowiki></code> |<code><nowiki>== titre 2 ==</nowiki></code> |- |Titre de niveau 3 |<code><nowiki><h3>titre 3</h3></nowiki></code> |<code><nowiki>### titre 3</nowiki></code><hr /><code><nowiki>### titre 3 ###</nowiki></code> |<code><nowiki>=== titre 3 ===</nowiki></code> |- |Titre de niveau 4 |<code><nowiki><h4>titre 4</h4></nowiki></code> |<code><nowiki>#### titre 4</nowiki></code><hr /><code><nowiki>#### titre 4 ####</nowiki></code> |<code><nowiki>==== titre 4 ====</nowiki></code> |- |Titre de niveau 5 |<code><nowiki><h5>titre 5</h5></nowiki></code> |<code><nowiki>##### titre 5</nowiki></code><hr /><code><nowiki>##### titre 5 #####</nowiki></code> |<code><nowiki>===== titre 5 =====</nowiki></code> |- |Titre de niveau 6 |<code><nowiki><h6>titre 6</h6></nowiki></code> |<code><nowiki>###### titre 6</nowiki></code><hr /><code><nowiki>###### titre 6 ######</nowiki></code> |<code><nowiki>====== titre 6 ======</nowiki></code> |- |Titre de niveau 7 |<nowiki>-</nowiki> |<nowiki>-</nowiki> |<nowiki>-</nowiki> |- |Liste à puces |<code><nowiki><ul></nowiki><br /><nowiki> <li>point 1</li></nowiki><br /><nowiki> <li>point 2</li></nowiki><br /><nowiki></ul></nowiki></code> |<code><br /><nowiki>- point 1</nowiki><br /><nowiki>- point 2</nowiki></code><hr /><code><br /><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code> |<code><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code> |- |Liste numérotée |<code><nowiki><ol></nowiki><br /><nowiki> <li>point 1</li></nowiki><br /><nowiki> <li>point 2</li></nowiki><br /><nowiki></ol></nowiki></code> |<code><br /><nowiki>1. point 1</nowiki><br /><nowiki>2. point 2</nowiki></code> |<code><nowiki># point 1</nowiki><br /><nowiki># point 2</nowiki></code> |- |<code><nowiki></nowiki></code> |<code><nowiki></nowiki></code> |<code><nowiki></nowiki></code> |} d736f346b9ac6d20d0d9f45e1ebcabcb43f3074d 4 3 2014-09-07T11:05:57Z Seb35 1 /* Comparaisons */ wikitext text/x-wiki == Ressources == L’article Wikipédia en anglais "[https://en.wikipedia.org/wiki/Lightweight_markup_language Lightweight markup language]" est bien fait et compare les différentes syntaxes. Autres avis ci et là : * http://dubroy.com/blog/on-wiki-markup-languages/ * http://mojomojo.org/documentation/textile_vs_markdown * http://stackoverflow.com/questions/659227/compare-and-contrast-the-lightweight-markup-languages * http://blog.codinghorror.com/the-future-of-markdown/ * http://fgallaire.flext.net/comparaison-langage-balisage-markup-lightweight-leger-txt2tags-pandoc-docutils-asciidoc-deplate-stx2any-aft-markdown-textile/ * http://www.wilfred.me.uk/blog/2012/07/30/why-markdown-is-not-my-favourite-language/ == Comparaisons == === Emphase === ==== Italique ==== * HTML : <code><nowiki><i>italique</i></nowiki></code> * Markdown : <code><nowiki>_italique_</nowiki></code> ou <code><nowiki>*italique*</nowiki></code> (HTML = <code><nowiki><em>italique</em></nowiki></code>) * MediaWiki : <code><nowiki>''italique''</nowiki></code> ==== Gras ==== * HTML : <code><nowiki><b>gras</b></nowiki></code> * Markdown : <code><nowiki>__gras__</nowiki></code> ou <code><nowiki>**gras**</nowiki></code> (HTML = <code><nowiki><strong>gras</strong></nowiki></code>) * MediaWiki : <code><nowiki>'''gras'''</nowiki></code> === Titres === ==== Titre de niveau 1 ==== * HTML : <code><nowiki><h1>Titre 1</h1></nowiki></code> * Markdown : <code><nowiki># Titre 1</nowiki></code> ou <code><nowiki># Titre 1 #</nowiki></code> ou <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>Titre 1</nowiki><br /><nowiki>=======</nowiki></code></span> * MediaWiki : <code><nowiki>= Titre 1 =</nowiki></code> ==== Titre de niveau 2 ==== * HTML : <code><nowiki><h2>Titre 2</h2></nowiki></code> * Markdown : <code><nowiki>## Titre 2</nowiki></code> ou <code><nowiki>## Titre 2 ##</nowiki></code> ou <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>Titre 2</nowiki><br /><nowiki>-------</nowiki></code></span> * MediaWiki : <code><nowiki>== Titre 2 ==</nowiki></code> ==== Titre de niveau 3 ==== * HTML : <code><nowiki><h3>Titre 3</h3></nowiki></code> * Markdown : <code><nowiki>### Titre 3</nowiki></code> ou <code><nowiki>### Titre 3 ###</nowiki></code> * MediaWiki : <code><nowiki>=== Titre 3 ===</nowiki></code> ==== Titre de niveau 4 ==== * HTML : <code><nowiki><h4>Titre 4</h4></nowiki></code> * Markdown : <code><nowiki>#### Titre 4</nowiki></code> ou <code><nowiki>#### Titre 4 ####</nowiki></code> * MediaWiki : <code><nowiki>==== Titre 4 ====</nowiki></code> ==== Titre de niveau 5 ==== * HTML : <code><nowiki><h5>Titre 5</h5></nowiki></code> * Markdown : <code><nowiki>##### Titre 5</nowiki></code> ou <code><nowiki>##### Titre 5 #####</nowiki></code> * MediaWiki : <code><nowiki>===== Titre 5 =====</nowiki></code> ==== Titre de niveau 6 ==== * HTML : <code><nowiki><h6>Titre 6</h6></nowiki></code> * Markdown : <code><nowiki>###### Titre 6</nowiki></code> ou <code><nowiki>###### Titre 6 ######</nowiki></code> * MediaWiki : <code><nowiki>====== Titre 6 ======</nowiki></code> ==== Titre de niveau 7 ==== * HTML : néant * Markdown : néant * MediaWiki : néant ==== Titre de niveau n ==== * HTML : néant * Markdown : néant * MediaWiki : néant === Listes === ==== Liste à puces ==== * HTML : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki><ul></nowiki><br /><nowiki> <li>point 1</li></nowiki><br /><nowiki> <li>point 2</li></nowiki><br /><nowiki></ul></nowiki></code></span> * Markdown : <span style="display:inline-table;"><span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><span style="color:grey;">(ligne blanche)</span><br /><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code></span> <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><span style="color:grey;">(ligne blanche)</span><br /><nowiki>- point 1</nowiki><br /><nowiki>- point 2</nowiki></code></span></span> * MediaWiki : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code></span> ==== Liste numérotée ==== * HTML : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki><ol></nowiki><br /><nowiki> <li>point 1</li></nowiki><br /><nowiki> <li>point 2</li></nowiki><br /><nowiki></ol></nowiki></code></span> * Markdown : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><span style="color:grey;">(ligne blanche)</span><br /><nowiki>1. point 1</nowiki><br /><nowiki>2. point 2</nowiki></code></span> * MediaWiki : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki># point 1</nowiki><br /><nowiki># point 2</nowiki></code></span> fe53ca27f367c9d57653493fe9635ea771078cd6 7 4 2014-09-07T11:36:29Z Seb35 1 +textile, découpage de la section emphase en sous-sections wikitext text/x-wiki == Ressources == L’article Wikipédia en anglais "[https://en.wikipedia.org/wiki/Lightweight_markup_language Lightweight markup language]" est bien fait et compare les différentes syntaxes. Autres avis ci et là : * http://dubroy.com/blog/on-wiki-markup-languages/ * http://mojomojo.org/documentation/textile_vs_markdown * http://stackoverflow.com/questions/659227/compare-and-contrast-the-lightweight-markup-languages * http://blog.codinghorror.com/the-future-of-markdown/ * http://fgallaire.flext.net/comparaison-langage-balisage-markup-lightweight-leger-txt2tags-pandoc-docutils-asciidoc-deplate-stx2any-aft-markdown-textile/ * http://www.wilfred.me.uk/blog/2012/07/30/why-markdown-is-not-my-favourite-language/ == Comparaisons == === Emphase === ==== Italique ==== * HTML : <code><nowiki><i>italique</i></nowiki></code> * Markdown : néant * MediaWiki : <code><nowiki>''italique''</nowiki></code> * Textile : <code><nowiki>__italique__</nowiki></code> ==== Gras ==== * HTML : <code><nowiki><b>gras</b></nowiki></code> * Markdown : néant * MediaWiki : <code><nowiki>'''gras'''</nowiki></code> * Textile : <code><nowiki>**gras**</nowiki></code> ==== Emphase légère ==== * HTML : <code><nowiki><em>emphase légère</em></nowiki></code> * Markdown : <code><nowiki>_emphase légère_</nowiki></code> ou <code><nowiki>*emphase légère*</nowiki></code> * MediaWiki : néant * Textile : <code><nowiki>_emphase légère_</nowiki></code> ==== Emphase forte ==== * HTML : <code><nowiki><strong>emphase forte</strong></nowiki></code> * Markdown : <code><nowiki>__emphase forte__</nowiki></code> ou <code><nowiki>**emphase forte**</nowiki></code> * MediaWiki : néant * Textile : <code><nowiki>*emphase forte*</nowiki></code> === Titres === ==== Titre de niveau 1 ==== * HTML : <code><nowiki><h1>Titre 1</h1></nowiki></code> * Markdown : <code><nowiki># Titre 1</nowiki></code> ou <code><nowiki># Titre 1 #</nowiki></code> ou <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>Titre 1</nowiki><br /><nowiki>=======</nowiki></code></span> * MediaWiki : <code><nowiki>= Titre 1 =</nowiki></code> * Textile : <code><nowiki>h1. Titre 1</nowiki></code> ==== Titre de niveau 2 ==== * HTML : <code><nowiki><h2>Titre 2</h2></nowiki></code> * Markdown : <code><nowiki>## Titre 2</nowiki></code> ou <code><nowiki>## Titre 2 ##</nowiki></code> ou <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>Titre 2</nowiki><br /><nowiki>-------</nowiki></code></span> * MediaWiki : <code><nowiki>== Titre 2 ==</nowiki></code> * Textile : <code><nowiki>h2. Titre 2</nowiki></code> ==== Titre de niveau 3 ==== * HTML : <code><nowiki><h3>Titre 3</h3></nowiki></code> * Markdown : <code><nowiki>### Titre 3</nowiki></code> ou <code><nowiki>### Titre 3 ###</nowiki></code> * MediaWiki : <code><nowiki>=== Titre 3 ===</nowiki></code> * Textile : <code><nowiki>h3. Titre 3</nowiki></code> ==== Titre de niveau 4 ==== * HTML : <code><nowiki><h4>Titre 4</h4></nowiki></code> * Markdown : <code><nowiki>#### Titre 4</nowiki></code> ou <code><nowiki>#### Titre 4 ####</nowiki></code> * MediaWiki : <code><nowiki>==== Titre 4 ====</nowiki></code> * Textile : <code><nowiki>h4. Titre 4</nowiki></code> ==== Titre de niveau 5 ==== * HTML : <code><nowiki><h5>Titre 5</h5></nowiki></code> * Markdown : <code><nowiki>##### Titre 5</nowiki></code> ou <code><nowiki>##### Titre 5 #####</nowiki></code> * MediaWiki : <code><nowiki>===== Titre 5 =====</nowiki></code> * Textile : <code><nowiki>h5. Titre 5</nowiki></code> ==== Titre de niveau 6 ==== * HTML : <code><nowiki><h6>Titre 6</h6></nowiki></code> * Markdown : <code><nowiki>###### Titre 6</nowiki></code> ou <code><nowiki>###### Titre 6 ######</nowiki></code> * MediaWiki : <code><nowiki>====== Titre 6 ======</nowiki></code> * Textile : <code><nowiki>h6. Titre 6</nowiki></code> ==== Titre de niveau 7 ==== * HTML : néant * Markdown : néant * MediaWiki : néant * Textile : néant ==== Titre de niveau n ==== * HTML : néant * Markdown : néant * MediaWiki : néant * Textile : néant === Listes === ==== Liste à puces ==== * HTML : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki><ul></nowiki><br /><nowiki> <li>point 1</li></nowiki><br /><nowiki> <li>point 2</li></nowiki><br /><nowiki></ul></nowiki></code></span> * Markdown : <span style="display:inline-table;"><span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><span style="color:grey;">(ligne blanche)</span><br /><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code></span> <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><span style="color:grey;">(ligne blanche)</span><br /><nowiki>- point 1</nowiki><br /><nowiki>- point 2</nowiki></code></span></span> * MediaWiki : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code></span> * Textile : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code></span> ==== Liste numérotée ==== * HTML : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki><ol></nowiki><br /><nowiki> <li>point 1</li></nowiki><br /><nowiki> <li>point 2</li></nowiki><br /><nowiki></ol></nowiki></code></span> * Markdown : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><span style="color:grey;">(ligne blanche)</span><br /><nowiki>1. point 1</nowiki><br /><nowiki>2. point 2</nowiki></code></span> * MediaWiki : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki># point 1</nowiki><br /><nowiki># point 2</nowiki></code></span> * Textile : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki># point 1</nowiki><br /><nowiki># point 2</nowiki></code></span> 2a2b3d636acf3b17acc93bdf1279a63ebf1cfc96 MediaWiki:Common.css 8 4 5 2014-09-07T11:20:02Z Seb35 1 Contenu en couleur noire et non grise css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } c192b321ce6ee0a2598fc1728430dc8dd7f956e8 6 5 2014-09-07T11:22:34Z Seb35 1 Code en couleur grise css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } cc4a0dce0ee85eef19d9070126a132a367eba7d6 29 6 2014-12-12T12:00:30Z Seb35 1 +source sql (test) css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Source SQL */ div.source-sql { padding-left: 1em; text-indent: -1em; } div.source-sql br { padding-left: 1em; } 970b406a6c89d0bd00c5836502aeda59c783598f 30 29 2014-12-12T12:04:21Z Seb35 1 source sql (test) css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Source SQL */ div.source-sql { padding-left: 1em; text-indent: -1em; } div.source-sql br+span { padding-left: -1em; } 01175b4fd5c83c31cd5dbd8691495b212f665394 32 30 2014-12-12T12:10:44Z Seb35 1 source sql (test) css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Source SQL */ div.source-sql { padding-left: 1em; text-indent: -1em; } div.source-sql br + span { padding-left: -1em; } 401ea1e99f42f6efd492fe0998d17bca3f03787d 33 32 2014-12-12T12:12:44Z Seb35 1 source sql (test) css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Source SQL */ div.source-sql::first-line { padding-left: 1em; text-indent: -1em; } 638d8a5b45253cef869e70c2335632cf88723d47 34 33 2014-12-12T12:35:15Z Seb35 1 retrait source sql css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } cc4a0dce0ee85eef19d9070126a132a367eba7d6 Projet:Gestionnaire de mots de passe distribué 100 5 8 2014-09-08T12:53:18Z Seb35 1 init wikitext text/x-wiki Le '''gestionnaire de mots de passe distribué''' (nom temporaire) est un projet de gestionnaire de mots de passe, libre, portable, partagé, décentralisé, sécurisé et facile d’utilisation. Plus en détails : * <u>gestionnaire de mots de passe :</u> permet de stocker des mots de passe, personnels ou communs à plusieurs personnes * <u>libre :</u> logiciel libre (probablement sous licence WTFPL) * <u>portable :</u> utilisable sur ordinateur et tablettes (Windows, Mac, Linux, autres) et smartphone (Android, Firefox OS, iOS, autres) par l’utilisation de la technologie HTML5 * <u>partagé :</u> permet le partage (ou pas) des mots de passe entre plusieurs personnes * <u>décentralisé :</u> possibilité de stocker les mots de passe sur son ordinateur/smartphone, ou sur un serveur à distance (personnel ou nuage, fortement recommandé pour les mots de passe partagés) * <u>sécurisé :</u> utilisant le chiffrement et signature OpenPGP (standard) et le protocole Git pour la traçabilité (standard ''de facto'') * <u>facile d’utilisation :</u> (autant que possible) interface épurée et personnalisable, traduit dans plusieurs langues, accessible == Technologies utilisées == 8b18230c8073c7b2073cc38918601604c24b68da 9 8 2014-09-08T14:32:36Z Seb35 1 +modèle de menace wikitext text/x-wiki Le '''gestionnaire de mots de passe distribué''' (nom temporaire) est un projet de gestionnaire de mots de passe, libre, portable, partagé, décentralisé, sécurisé et facile d’utilisation. Plus en détails : * <u>gestionnaire de mots de passe :</u> permet de stocker des mots de passe (ou d’autres secrets), personnels ou communs à plusieurs personnes, l’accès se faisant avec un mot de passe central * <u>libre :</u> logiciel libre (probablement sous licence WTFPL) * <u>portable :</u> utilisable sur ordinateur et tablettes (Windows, Mac, Linux, autres) et smartphone (Android, Firefox OS, iOS, autres) par l’utilisation de la technologie HTML5 * <u>partagé :</u> permet le partage (ou pas) des mots de passe entre plusieurs personnes * <u>décentralisé :</u> possibilité de stocker les mots de passe sur son ordinateur/smartphone, ou sur un serveur à distance (personnel ou nuage, fortement recommandé pour les mots de passe partagés) * <u>sécurisé :</u> utilisant le chiffrement et signature OpenPGP (standard) et le protocole Git pour la traçabilité (standard ''de facto'') * <u>facile d’utilisation :</u> (autant que possible) interface épurée et personnalisable, traduit dans plusieurs langues, accessible, avec une documentation simple (et plus complète), idéalement ce logiciel remplirait automatiquement les champs "mots de passe" sur les sites == Technologies utilisées == * HTML5 + JavaScript : pour la portabilité * Git : pour la traçabilité / évolution * OpenPGP : pour la sécurité * AngularJS : pour l’interface * YAML : pour le format de stockage * packaging : propre à chaque plate-forme, node.js pour les serveurs == Architecture == En trois blocs logiciels principaux (architecture SOA) : * interface utilisateur * serveur de point de contact * infrastructure de stockage Les trois blocs logiciels sont implémentés en JavaScript et peuvent être répartis sur plusieurs machines ou être entièrement locaux sur une machine. Les scénarios possibles sont : * interface utilisateur sur un ordinateur/smartphone, discutant avec un serveur distant propre à la société, stockant les informations dans un nuage ou en local sur le serveur * entièrement local sur un ordinateur/smartphone * interface utilisateur disponible sur un site web sécurisé (privé ou public), dont le serveur sert de fait de point de contact, avec un stockage sur ce même serveur ou dans un nuage == Sécurité == === Modèle de menace === Le protocole de chiffrement et signature OpenPGP ainsi que les méthodes cryptographiques, sous-jacentes ou annexes, sont supposés sûrs (par définition : pas de logiciel espion, code source non-falsifié, pas de bugs mettant en péril la sécurité). Les implémentations des logiciels tiers sont supposées sûrs. Le logiciel est supposé être à jour. L’utilisateur ne doit pas passer outre les alertes de sécurité indiquées. La machine cliente et celle comportant l’interface utilisateur sont supposées sûres. Le serveur de point de contact et l’infrastructure de stockage peuvent ne pas être complètement sûrs, mais leur défaillance (opérationnelle ou liée à la sécurité) empêcheront le partage des mots de passe. L’accès au logiciel se fait au moyen d’un mot de passe ou de toute autre méthode, et son accès non-autorisé est supposé hors du périmètre du logiciel. Lors du partage de mots de passe, il est supposé que l’utilisateur, identifié par une clé OpenPGP, a confiance en les clés OpenPGP des autres utilisateurs de façon à pouvoir les identifier de façon certaine, et il lui appartient donc de régler comme il l’entend les paramètres de profondeur de sa toile de confiance OpenPGP ; la non-confiance de l’utilisateur en sa toile de confiance OpenPGP est hors du périmètre du logiciel. La reconstruction du graphe social des utilisateurs d’un point de contact est supposé hors du périmètre du logiciel. === Compléments au modèle de menace === La sûreté affirmée dans le modèle de menace permet de s’affranchir des problèmes non-liés directement au logiciel, mais il est bien sûr entendu qu’il sera fait au mieux pour assurer la meilleure sécurité globale au logiciel, notamment par : * le suivi de la sécurité des méthodes de cryptographie, * le suivi des mises à jour des logiciels tiers directement utilisés, * l’utilisation de méthodes verouillant l’accès au logiciel pour prévenir son utilisation non-autorisée, * la minimisation du nombre d’alertes de sécurité à celles d’une grande importance et la meilleure explication des alertes en question. Si un groupe d’utilisateurs partageant un ensemble de mots de passe ne veut pas voir son graphe social devenir public, il leur appartient de prendre les mesures appropriées, notamment : * l’utilisation d’un réseau d’anonymisation permettant à un attaquant passif écoutant le réseau de collecter les adresses IP se connectant au point de contact, * la création d’une toile de confiance locale par la mise en place d’un serveur de clés OpenPGP privé, * la publication ou non de leurs signatures des clés des pairs. La création d’une toile de confiance locale (par la mise en place d’un serveur de clés OpenPGP privé) peut également servir à une installation autonome, solutionant des débats sur la publication ou non du graphe social, et facilitant l’intégration avec un système d’authentification déjà en place. Par ailleurs, par simplification pour les utilisateurs, il peut être créé, au sein d’un point de contact ou pas, une clé OpenPGP centrale (détenue par un administrateur de confiance) qui authentifierait et signerait l’ensemble des clés du point de contact ou d’une communauté et dont les utilisateurs seraient supposés avoir confiance ; cela faciliterait la création d’une communauté de confiance. a0665572622da4c628b56f0f67e336c966c757eb Tutorial:Packaging de WebApps 102 6 10 2014-09-09T12:59:13Z Seb35 1 init wikitext text/x-wiki == Packaged Web Apps (Widgets) == * Specification: http://www.w3.org/TR/widgets/ * Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>config.xml</td><td>file</td><td>Configuration document</td></tr><tr><td>icon.png</td><td>file</td><td>Default icon</td></tr><tr><td>icon.gif</td><td>file</td><td>Default icon</td></tr><tr><td>icon.jpg</td><td>file</td><td>Default icon</td></tr><tr><td>icon.ico</td><td>file</td><td>Default icon</td></tr><tr><td>icon.svg</td><td>file</td><td>Default icon</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></tr><tr><td>index.htm</td><td>file</td><td>Default start file</td></tr><tr><td>index.svg</td><td>file</td><td>Default start file</td></tr><tr><td>index.xhtml</td><td>file</td><td>Default start file</td></tr><tr><td>index.xht</td><td>file</td><td>Default start file</td></tr><tr><td>locales</td><td>folder</td><td>Container for localized content</td></tr></table> * Package: ** Extension: .wgt ** MIME type: application/widget ** Archive: ZIP file ** Manifest: config.xml (see specification) == Firefox OS / Firefox Apps == * Documentation: https://developer.mozilla.org/en-US/Apps/Quickstart * Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>manifest.webapp</td><td>file</td><td>Manifest document</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></table> * Package: ** Archive: Web hosting or ZIP file ** Manifest: manifest.webapp 0a0f391017e4bb25714fff950d5b4653ac3e4256 11 10 2014-09-09T13:22:43Z Seb35 1 +header, +manifest for web apps and bookmarks (W3C WD) wikitext text/x-wiki List and comparison of various webapps packaging, with the aim at finding commonalities and differencies to create a directory structure compatible with a largest set of deployment targets. (Possibly if there are uncompatible directory structures between two deployment targets, it will be up to the developer to choose what target s/he prefers.) == Packaged Web Apps (Widgets) == * Status: W3C Recommandation * Specification: http://www.w3.org/TR/widgets/ * Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>config.xml</td><td>file</td><td>Configuration document</td></tr><tr><td>icon.png</td><td>file</td><td>Default icon</td></tr><tr><td>icon.gif</td><td>file</td><td>Default icon</td></tr><tr><td>icon.jpg</td><td>file</td><td>Default icon</td></tr><tr><td>icon.ico</td><td>file</td><td>Default icon</td></tr><tr><td>icon.svg</td><td>file</td><td>Default icon</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></tr><tr><td>index.htm</td><td>file</td><td>Default start file</td></tr><tr><td>index.svg</td><td>file</td><td>Default start file</td></tr><tr><td>index.xhtml</td><td>file</td><td>Default start file</td></tr><tr><td>index.xht</td><td>file</td><td>Default start file</td></tr><tr><td>locales</td><td>folder</td><td>Container for localized content</td></tr></table> * Package: ** Extension: .wgt ** MIME type: application/widget ** Archive: ZIP file ** Manifest: config.xml (see specification) == Firefox OS / Firefox Apps == * Status: Industry specification * Documentation: https://developer.mozilla.org/en-US/Apps/Quickstart * Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>manifest.webapp</td><td>file</td><td>Manifest document</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></table> * Package: ** Archive: Web hosting or ZIP file ** Manifest: manifest.webapp (see documentation) == Manifest for web apps and bookmarks == * Status: W3C Working Draft * Working draft: http://www.w3.org/TR/appmanifest/ * Package: ** Extension: N/A ** MIME type: N/A ** Archive: N/A ** Manifest: any name ** Manifest fetching method: &lt;link ref="manifest" href="..." /&gt; * Manifest: ** Extension: .json, .manifest ** MIME type: application/manifest+json ** Format: JSON 6a2fe1ce1923598c0bad4ff24b253eadfcd48e04 12 11 2014-09-09T14:40:38Z Seb35 1 +HTML5 cache wikitext text/x-wiki List and comparison of various webapps packaging, with the aim at finding commonalities and differencies to create a directory structure compatible with a largest set of deployment targets. (Possibly if there are uncompatible directory structures between two deployment targets, it will be up to the developer to choose what target s/he prefers.) == HTML5 == * Status: W3C Candidate Recommandation * Specification: http://www.w3.org/TR/html5/ * Package: ** Extension: ** MIME type: ** Format: ** Manifest: *.appcache * Cache manifest: ** Extension: .appcache ** MIME type: text/cache-manifest ** Format: text == Packaged Web Apps (Widgets) == * Status: W3C Recommandation * Specification: http://www.w3.org/TR/widgets/ * Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>config.xml</td><td>file</td><td>Configuration document</td></tr><tr><td>icon.png</td><td>file</td><td>Default icon</td></tr><tr><td>icon.gif</td><td>file</td><td>Default icon</td></tr><tr><td>icon.jpg</td><td>file</td><td>Default icon</td></tr><tr><td>icon.ico</td><td>file</td><td>Default icon</td></tr><tr><td>icon.svg</td><td>file</td><td>Default icon</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></tr><tr><td>index.htm</td><td>file</td><td>Default start file</td></tr><tr><td>index.svg</td><td>file</td><td>Default start file</td></tr><tr><td>index.xhtml</td><td>file</td><td>Default start file</td></tr><tr><td>index.xht</td><td>file</td><td>Default start file</td></tr><tr><td>locales</td><td>folder</td><td>Container for localized content</td></tr></table> * Package: ** Extension: .wgt ** MIME type: application/widget ** Format: ZIP file ** Manifest: config.xml (see specification) == Firefox OS / Firefox Apps == * Status: Industry specification * Documentation: https://developer.mozilla.org/en-US/Apps/Quickstart * Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>manifest.webapp</td><td>file</td><td>Manifest document</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></table> * Package: ** Format: Web hosting or ZIP file ** Manifest: manifest.webapp (see documentation) == Manifest for web apps and bookmarks == * Status: W3C Working Draft * Working draft: http://www.w3.org/TR/appmanifest/ * Package: ** Extension: N/A ** MIME type: N/A ** Format: N/A ** Manifest: * ** Manifest fetching method: &lt;link ref="manifest" href="..." /&gt; * Manifest: ** Extension: .json, .manifest ** MIME type: application/manifest+json ** Format: JSON 54b07aa493fe2d6815f413dd674dc6dab0b4e4c0 13 12 2014-09-09T20:30:05Z Seb35 1 +opera/chromium wikitext text/x-wiki List and comparison of various webapps packaging, with the aim at finding commonalities and differencies to create a directory structure compatible with a largest set of deployment targets. (Possibly if there are uncompatible directory structures between two deployment targets, it will be up to the developer to choose what target s/he prefers.) == HTML5 == * Status: W3C Candidate Recommandation * Specification: http://www.w3.org/TR/html5/ * Package: ** Extension: ** MIME type: ** Format: ** Manifest: *.appcache * Cache manifest: ** Extension: .appcache ** MIME type: text/cache-manifest ** Format: text == Packaged Web Apps (Widgets) == * Status: W3C Recommandation * Specification: http://www.w3.org/TR/widgets/ * Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>config.xml</td><td>file</td><td>Configuration document</td></tr><tr><td>icon.png</td><td>file</td><td>Default icon</td></tr><tr><td>icon.gif</td><td>file</td><td>Default icon</td></tr><tr><td>icon.jpg</td><td>file</td><td>Default icon</td></tr><tr><td>icon.ico</td><td>file</td><td>Default icon</td></tr><tr><td>icon.svg</td><td>file</td><td>Default icon</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></tr><tr><td>index.htm</td><td>file</td><td>Default start file</td></tr><tr><td>index.svg</td><td>file</td><td>Default start file</td></tr><tr><td>index.xhtml</td><td>file</td><td>Default start file</td></tr><tr><td>index.xht</td><td>file</td><td>Default start file</td></tr><tr><td>locales</td><td>folder</td><td>Container for localized content</td></tr></table> * Package: ** Extension: .wgt ** MIME type: application/widget ** Format: ZIP file ** Manifest: config.xml (see specification) == Firefox OS / Firefox Apps == * Status: Industry specification * Documentation: https://developer.mozilla.org/en-US/Apps/Quickstart * Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>manifest.webapp</td><td>file</td><td>Manifest document</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></table> * Package: ** Format: Web hosting or ZIP file ** Manifest: manifest.webapp (see documentation) == Manifest for web apps and bookmarks == * Status: W3C Working Draft * Working draft: http://www.w3.org/TR/appmanifest/ * Package: ** Extension: N/A ** MIME type: N/A ** Format: N/A ** Manifest: * ** Manifest fetching method: &lt;link ref="manifest" href="..." /&gt; * Manifest: ** Extension: .json, .manifest ** MIME type: application/manifest+json ** Format: JSON == Opera 14- == * Status: Industry specification (deprecated) * Package: ** Extension: .oex ** Format: ZIP file == Chromium / Opera 15+ == * Status: Industry specification * Documentation Opera: https://dev.opera.com/extensions/ * Package: ** Extension: .nex ** MIME type: ** Format: ZIP file ** Manifest: manifest.json * Manifest: ** Filename: manifest.json ** Format: JSON b49c05eef275bab345a74fe92a9da7f1bb999bed Projet:Gestionnaire de mots de passe distribué/Bibliothèques 100 7 14 2014-10-04T11:00:02Z Seb35 1 bibliothèque wikitext text/x-wiki == Commun == * Lecture YAML : [https://www.npmjs.org/package/js-yaml js-yaml] (node + browser) * OpenPGP : [http://openpgpjs.org/ OpenPGPjs] * Git : [https://github.com/creationix/js-git js-git] == Interface client graphique == * Interface client : [https://www.angularjs.org AngularJS] * Arborescence (AngularJS) : [http://ngmodules.org/modules/angular.treeview angular.treeview] == Serveur de point de contact == * [http://www.nodejs.org Node.js] == Infrastructure de stockage == * NodeJS require('fs') * [https://www.dropbox.com/developers Dropbox API] 5ea8c946aa4da50e127ea49bab249d419682de7a Fichier:Archéo Lex.png 6 8 15 2014-11-26T20:38:28Z Seb35 1 Licence : WTFPL 2.0 wikitext text/x-wiki Licence : WTFPL 2.0 92d44f42c0999c70686499365fee05dcd20f3216 Tutorial:Beautiful MediaWiki URLs 102 178 16 2014-11-26T23:36:26Z Seb35 1 first part wikitext text/x-wiki This page is about configurating beautiful, pure URLs for MediaWiki, basically without any visible "index.php". The reasoning is that this syntax "index.php" is not interesting from the user’s point of view, and it’s ugly, so it shouldn’t be there. This wiki implements these rules. Technically, this comes from [[:enwikipedia:Common Gateway Interface|CGI scripts]], and this have to be taken into account to configure the server. Thereafter is the configuration to achieve that with [[:enwikipedia:nginx|nginx]]. == Prerequisites == * A server * MediaWiki on this server in the directory, say, '/mediawiki' * nginx, preferably with the module Lua == MediaWiki configuration == In the file LocalSettings.php, add the following directives at the end. Remove the "script path" to remove all subdirectories. $wgScriptPath = ''; Set the article path to its simplest form. With this, links to view the articles will be beautiful. $wgArticlePath = '/$1'; Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = ''; The links for the actions have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. You can remark the title is displayed twice. To remove this, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'urlPhpAgnostic'; function urlPhpAgnostic( &$title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != '' ) { $url = wfAppendQuery( $url, $query ); } } ba04c2e2a497d4b5290819601e07fab1b76be931 17 16 2014-11-27T00:04:35Z Seb35 1 second part wikitext text/x-wiki This page is about configurating beautiful, pure URLs for MediaWiki, basically without any visible "index.php". The reasoning is that this syntax "index.php" is not interesting from the user’s point of view, and it’s ugly, so it shouldn’t be there. This wiki implements these rules. Technically, this comes from [[:enwikipedia:Common Gateway Interface|CGI scripts]], and this have to be taken into account to configure the server. Thereafter is the configuration to achieve that with [[:enwikipedia:nginx|nginx]]. == Prerequisites == * A server * MediaWiki, in the directory, say, '/mediawiki' * nginx, preferably with the module Lua == MediaWiki configuration == In the file LocalSettings.php, add the following directives at the end. Remove the "script path" to remove all subdirectories. $wgScriptPath = ''; Set the article path to its simplest form. With this, links to view the articles will be beautiful. $wgArticlePath = '/$1'; Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = ''; The links for the actions have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. You can remark the title is displayed twice. To remove this, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'urlPhpAgnostic'; function urlPhpAgnostic( &$title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != '' ) { $url = wfAppendQuery( $url, $query ); } } == Nginx configuration == The basic skeleton is just below. We will then add 'location' directives. server { listen 80; listen 443 ssl; server_name my-wiki.example; root /mediawiki; # 'location' directives to be added here } First, let’s add simple things: backend PHP scripts (I don’t search to hide them, they are backend so not viewed by human users). location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } Next, the more important thing: the call to index.php to catch all actions and transmit them to MediaWiki. location / { if ($arg_title != '') { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } The normal scenario, at the end of the location /, split the first part of the URL (only the slash) and the title of the article, transmitted to PHP/MediaWiki via the FastCGI parameter PATH_INFO. The first part of the location / rewrite remaining "title=" which can still be found in MediaWiki in the forms (Special:Recentchanges, Special:Log, etc.) -- AFAIK there is no way to improve this directly in MediaWiki without modifying the core (which is bad because it adds work for the updates). Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are allowed only: the JS files, the images, the CSS and LESS files, and .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } 4886f1411b5a36524212caff4a765a02586e445c 18 17 2014-11-27T00:14:43Z Seb35 1 conclusion wikitext text/x-wiki This page is about configurating beautiful, pure URLs for MediaWiki, basically without any visible "index.php". The reasoning is that this syntax "index.php" is not interesting from the user’s point of view, and it’s ugly, so it shouldn’t be there. This wiki implements these rules. Technically, this comes from [[:enwikipedia:Common Gateway Interface|CGI scripts]], and this have to be taken into account to configure the server. Thereafter is the configuration to achieve that with [[:enwikipedia:nginx|nginx]]. == Prerequisites == * A server * MediaWiki, in the directory, say, '/mediawiki' * nginx, preferably with the module Lua == MediaWiki configuration == In the file LocalSettings.php, add the following directives at the end. Remove the "script path" to remove all subdirectories. $wgScriptPath = ''; Set the article path to its simplest form. With this, links to view the articles will be beautiful. $wgArticlePath = '/$1'; Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = ''; The links for the actions have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. You can remark the title is displayed twice. To remove this, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'urlPhpAgnostic'; function urlPhpAgnostic( &$title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != '' ) { $url = wfAppendQuery( $url, $query ); } } == Nginx configuration == The basic skeleton is just below. We will then add 'location' directives. server { listen 80; listen 443 ssl; server_name my-wiki.example; root /mediawiki; # 'location' directives to be added here } First, let’s add simple things: backend PHP scripts (I don’t search to hide them, they are backend so not viewed by human users). location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } Next, the more important thing: the call to index.php to catch all actions and transmit them to MediaWiki. location / { if ($arg_title != '') { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } The normal scenario, at the end of the location /, split the first part of the URL (only the slash) and the title of the article, transmitted to PHP/MediaWiki via the FastCGI parameter PATH_INFO. The first part of the location / rewrite remaining "title=" which can still be found in MediaWiki in the forms (Special:Recentchanges, Special:Log, etc.) -- AFAIK there is no way to improve this directly in MediaWiki without modifying the core (which is bad because it adds work for the updates). Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are allowed only: the JS files, the images, the CSS and LESS files, and .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital). # Apart whitelisted system files and subdirectories, nobody can access underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files, s/he has to deal with MediaWiki before attacking PHP files. a6d1baf5e262d7a257b26a5a5f5e579c6f91b366 19 18 2014-11-27T09:21:25Z Seb35 1 polishing MW part wikitext text/x-wiki This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :https://wiki.seb35.fr/Learning:Beautiful_MediaWiki_URLs?action=edit ''instead of'' :https://wiki.seb35.fr/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit </div> and it is even worse in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :https://wiki.seb35.fr/维基百科?action=history ''instead of'' :https://wiki.seb35.fr/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } == Nginx configuration == The basic skeleton is just below. We will then add 'location' directives. server { listen 80; listen 443 ssl; server_name my-wiki.example; root /var/www/mediawiki; # 'location' directives to be added here } First, let’s add simple things: backend PHP scripts (I don’t search to hide them, they are backend so not viewed by human users). location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } Next, the more important thing: the call to index.php to catch all actions and transmit them to MediaWiki. location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } The normal scenario, at the end of the location /, split the first part of the URL (only the slash) and the title of the article, transmitted to PHP/MediaWiki via the FastCGI parameter PATH_INFO. The first part of the location / rewrite remaining "title=" which can still be found in MediaWiki in the forms (Special:Recentchanges, Special:Log, etc.) -- AFAIK there is no way to improve this directly in MediaWiki without modifying the core (which is bad because it adds work for the updates). Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are allowed only: the JS files, the images, the CSS and LESS files, and .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital). # Apart whitelisted system files and subdirectories, nobody can access underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files, s/he has to deal with MediaWiki before attacking PHP files. 7941e1d09ed9a44da04797da072323b78d01edb6 20 19 2014-11-27T09:27:20Z Seb35 1 server variable wikitext text/x-wiki This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit ''instead of'' :{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit </div> and it is even worse in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/维基百科?action=history ''instead of'' :{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } == Nginx configuration == The basic skeleton is just below. We will then add 'location' directives. server { listen 80; listen 443 ssl; server_name my-wiki.example; root /var/www/mediawiki; # 'location' directives to be added here } First, let’s add simple things: backend PHP scripts (I don’t search to hide them, they are backend so not viewed by human users). location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } Next, the more important thing: the call to index.php to catch all actions and transmit them to MediaWiki. location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } The normal scenario, at the end of the location /, split the first part of the URL (only the slash) and the title of the article, transmitted to PHP/MediaWiki via the FastCGI parameter PATH_INFO. The first part of the location / rewrite remaining "title=" which can still be found in MediaWiki in the forms (Special:Recentchanges, Special:Log, etc.) -- AFAIK there is no way to improve this directly in MediaWiki without modifying the core (which is bad because it adds work for the updates). Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are allowed only: the JS files, the images, the CSS and LESS files, and .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital). # Apart whitelisted system files and subdirectories, nobody can access underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files, s/he has to deal with MediaWiki before attacking PHP files. ff1d54bf5adfb15a961b1288919788aeebba22df 21 20 2014-11-27T10:40:50Z Seb35 1 polishing nginx part, adding "complements" part wikitext text/x-wiki This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit ''instead of'' :{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit </div> and it is even worse in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/维基百科?action=history ''instead of'' :{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to a [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a "<nowiki><input type="hidden" name="title" … /></nowiki>" HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital). # Apart whitelisted system files and subdirectories, nobody can access to the underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. b54898887917c7146dc287d0c2d721bd91eb9faf 22 21 2014-11-27T10:41:46Z Seb35 1 wikitext text/x-wiki This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit ''instead of'' :{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/维基百科?action=history ''instead of'' :{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to a [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a "<nowiki><input type="hidden" name="title" … /></nowiki>" HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital). # Apart whitelisted system files and subdirectories, nobody can access to the underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. a8af63e3e2a5ae10dce08401e41a41b3ceef4962 23 22 2014-11-27T10:55:12Z Seb35 1 /* Complements */ wikitext text/x-wiki This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit ''instead of'' :{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/维基百科?action=history ''instead of'' :{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to a [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a "<nowiki><input type="hidden" name="title" … /></nowiki>" HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :) == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital). # Apart whitelisted system files and subdirectories, nobody can access to the underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. 75860e2fbc2cc9af4ba2f0d784ebf34e43509acb 24 23 2014-11-27T10:56:10Z Seb35 1 spaces between paragraphs wikitext text/x-wiki This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit ''instead of'' :{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/维基百科?action=history ''instead of'' :{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to a [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a "<nowiki><input type="hidden" name="title" … /></nowiki>" HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :) == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital). # Apart whitelisted system files and subdirectories, nobody can access to the underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. 14edcc7713bb4777f693cd65660ecffdca9ba75e 25 24 2014-11-27T10:57:20Z Seb35 1 wikitext text/x-wiki This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit ''instead of'' :{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/维基百科?action=history ''instead of'' :{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to a [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :) == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital). # Apart whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. 50347de31c1bf24fdc310f721aa3c14c62bccd41 26 25 2014-11-27T11:10:27Z Seb35 1 typo wikitext text/x-wiki This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit ''instead of'' :{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/维基百科?action=history ''instead of'' :{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :) == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital). # Apart whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. 8d46824e176de7a474c2d35a857539a8eeb7f9d3 27 26 2014-11-27T11:34:59Z Seb35 1 /* Conclusion */ wikitext text/x-wiki This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit ''instead of'' :{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/维基百科?action=history ''instead of'' :{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :) == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital). # Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. 9850067e9de9dce5badf5078964cb00619f2f54e Archéo Lex/Base de données 0 10 31 2014-12-12T12:09:07Z Seb35 1 init wikitext text/x-wiki Archéo Lex importe dans un base de données SQLite les données parsées des textes de loi à partir des bases XML ouvertes (LEGI, KALI, etc.). Pour l’instant, seule la base LEGI a été testée. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data'') sous réserve d’avoir encore les textes des articles dans leur version d’alors. La base de données contient toutes les métadonnées utiles extraites des bases XML ainsi que les intitulés des sections (généralement quelques mots). En particulier, elle ne contient pas les articles (dans cette version de la base de données SQLite) car cela prendrait beaucoup de place, pas forcément utilement. == Structure == ; texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "texte" ("cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE); </syntaxhighlight> ; version_texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_texte" ("id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id")); CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id"); CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id"); </syntaxhighlight> ; section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "section" ("cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid")); CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id"); CREATE INDEX "section_texte_id" ON "section" ("texte_id"); </syntaxhighlight> ; version_section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_section" ("id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")); CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id"); CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id"); CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id"); CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id"); </syntaxhighlight> ; article <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "article" ("id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")); CREATE INDEX "article_texte_id" ON "article" ("texte_id"); CREATE INDEX "article_version_section_id" ON "article" ("version_section_id"); CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id"); </syntaxhighlight> bdbefbb3c25e9d807d676a307c55943dde181641 35 31 2014-12-12T12:37:23Z Seb35 1 /* Structure */ typo wikitext text/x-wiki Archéo Lex importe dans un base de données SQLite les données parsées des textes de loi à partir des bases XML ouvertes (LEGI, KALI, etc.). Pour l’instant, seule la base LEGI a été testée. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data'') sous réserve d’avoir encore les textes des articles dans leur version d’alors. La base de données contient toutes les métadonnées utiles extraites des bases XML ainsi que les intitulés des sections (généralement quelques mots). En particulier, elle ne contient pas les articles (dans cette version de la base de données SQLite) car cela prendrait beaucoup de place, pas forcément utilement. == Structure == ; texte <syntaxhighlight lang="sql" enclose="div" style="padding-left:2em; text-indent:-1em;"> CREATE TABLE "texte" ("cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE); </syntaxhighlight> ; version_texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_texte" ("id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id")); CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id"); CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id"); </syntaxhighlight> ; section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "section" ("cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid")); CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id"); CREATE INDEX "section_texte_id" ON "section" ("texte_id"); </syntaxhighlight> ; version_section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_section" ("id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")); CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id"); CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id"); CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id"); CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id"); </syntaxhighlight> ; article <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "article" ("id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")); CREATE INDEX "article_texte_id" ON "article" ("texte_id"); CREATE INDEX "article_version_section_id" ON "article" ("version_section_id"); CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id"); </syntaxhighlight> 91e55330af52c2edc1f0e81c074ee76f72e9afc1 36 35 2014-12-21T16:44:05Z Seb35 1 +explication de <s>texte</s> base de données wikitext text/x-wiki Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place. == Structure == La base de données comprend deux types d’informations : # la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ; # les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>. De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>. == Schéma SQL == ; texte <syntaxhighlight lang="sql" enclose="div" style="padding-left:2em; text-indent:-1em;"> CREATE TABLE "texte" ("cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE); </syntaxhighlight> ; version_texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_texte" ("id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id")); CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id"); CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id"); </syntaxhighlight> ; section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "section" ("cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid")); CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id"); CREATE INDEX "section_texte_id" ON "section" ("texte_id"); </syntaxhighlight> ; version_section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_section" ("id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")); CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id"); CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id"); CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id"); CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id"); </syntaxhighlight> ; article <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "article" ("id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")); CREATE INDEX "article_texte_id" ON "article" ("texte_id"); CREATE INDEX "article_version_section_id" ON "article" ("version_section_id"); CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id"); </syntaxhighlight> ed0e5ad926ab37d70172cd9f50bf01fcf922380b 38 36 2014-12-21T18:39:28Z Seb35 1 +schéma, +schéma sql plus lisible wikitext text/x-wiki Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place. == Structure == La base de données comprend deux types d’informations : # la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ; # les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>. De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>. == Schéma SQL == [[Fichier:BDD Archéo Lex.svg|center]] ; texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "texte" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE ); </syntaxhighlight> ; version_texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_texte" ( "id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id"); CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id"); </syntaxhighlight> ; section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "section" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid") ); CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id"); CREATE INDEX "section_texte_id" ON "section" ("texte_id"); </syntaxhighlight> ; version_section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_section" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id"); CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id"); CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id"); CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id"); </syntaxhighlight> ; article <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "article" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "article_texte_id" ON "article" ("texte_id"); CREATE INDEX "article_version_section_id" ON "article" ("version_section_id"); CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id"); </syntaxhighlight> 532025e5497e4f00d4e4019b56d03647fcbd4760 45 38 2014-12-22T14:04:25Z Seb35 1 +cat wikitext text/x-wiki Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place. == Structure == La base de données comprend deux types d’informations : # la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ; # les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>. De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>. == Schéma SQL == [[Fichier:BDD Archéo Lex.svg|center]] ; texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "texte" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE ); </syntaxhighlight> ; version_texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_texte" ( "id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id"); CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id"); </syntaxhighlight> ; section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "section" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid") ); CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id"); CREATE INDEX "section_texte_id" ON "section" ("texte_id"); </syntaxhighlight> ; version_section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_section" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id"); CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id"); CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id"); CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id"); </syntaxhighlight> ; article <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "article" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "article_texte_id" ON "article" ("texte_id"); CREATE INDEX "article_version_section_id" ON "article" ("version_section_id"); CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id"); </syntaxhighlight> [[Catégorie:Archéo Lex]] 3bc5ec40940051334ae91d7e1bc34a9d32247d8d 49 45 2014-12-23T12:08:15Z Seb35 1 tag 1.0 wikitext text/x-wiki Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place. == Structure == La base de données comprend deux types d’informations : # la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ; # les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>. De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>. == Schéma SQL 1.0 == [[Fichier:BDD Archéo Lex 1.0.svg|center]] ; texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "texte" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE ); </syntaxhighlight> ; version_texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_texte" ( "id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id"); CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id"); </syntaxhighlight> ; section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "section" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid") ); CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id"); CREATE INDEX "section_texte_id" ON "section" ("texte_id"); </syntaxhighlight> ; version_section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_section" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id"); CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id"); CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id"); CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id"); </syntaxhighlight> ; article <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "article" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "article_texte_id" ON "article" ("texte_id"); CREATE INDEX "article_version_section_id" ON "article" ("version_section_id"); CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id"); </syntaxhighlight> [[Catégorie:Archéo Lex]] fc87083f537baf36d5af8e45bcd0e662d4ebe1e3 Fichier:BDD Archéo Lex 1.0.svg 6 11 37 2014-12-21T18:25:01Z Seb35 1 Licence WTFPL 2.0 Version BDD : 1.0 wikitext text/x-wiki Licence WTFPL 2.0 Version BDD : 1.0 27795a057532cde04720376daa498a67506a83c4 47 37 2014-12-23T12:06:44Z Seb35 1 Seb35 a déplacé la page [[Fichier:BDD Archéo Lex.svg]] vers [[Fichier:BDD Archéo Lex 1.0.svg]] : numérotation de version wikitext text/x-wiki Licence WTFPL 2.0 Version BDD : 1.0 27795a057532cde04720376daa498a67506a83c4 Archéo Lex/Base LEGI 0 12 39 2014-12-21T20:52:09Z Seb35 1 tutorial pour parcourir la base LEGI wikitext text/x-wiki Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (LEGITEXT000006069414). De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres). '''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************". :Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414". :Ce dossier contient trois sous-dossiers : :# "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant :# "section_ta" : similaire aux articles, mais pour les sections (les titres de parties) :# "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles '''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml" : Ce fichier XML contient les balises suivantes importantes : :* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article) :* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO de l’objet XML (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée en vigueur de l’objet XML, c’est-à-dire la date de référence pour les opérations de consolidation :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.) '''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml" : Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont : :* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code) :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI :* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont : :** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante :** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur :** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section :** le contenu de cette balise est le nom de la section '''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml" : Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml". : Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont : :* SECTION_TA / ID : identifiant de la section en cours :* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative" :* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte) :* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur) '''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles : Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative, Première partie : La propriété littéraire et artistique, Livre Ier : Le droit d'auteur, Titre Ier : Objet du droit d'auteur, Chapitre Ier : Nature du droit d'auteur. : Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont : :* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver :* SECTION_TA / STRUCTURE_TA / (LIENT_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent '''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" : Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867). : Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont : :* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent :* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique :* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01 :* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections :* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques :* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML :* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte 606cd0d686bf4fb9e7db2086ea6f602e7e1bfb27 40 39 2014-12-21T21:05:01Z Seb35 1 +cat wikitext text/x-wiki Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (CPI) dont l’identifiant est LEGITEXT000006069414. De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres). '''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************". :Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414". :Ce dossier contient trois sous-dossiers : :# "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant :# "section_ta" : similaire aux articles, mais pour les sections (les titres de parties) :# "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles '''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml" : Ce fichier XML les métadonnées générales du texte. Il contient les balises suivantes importantes : :* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article) :* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO de l’objet XML (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée en vigueur de l’objet XML, c’est-à-dire la date de référence pour les opérations de consolidation :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.) '''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml" : Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont : :* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code) :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI :* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont : :** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante :** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur :** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section :** le contenu de cette balise est le nom de la section '''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml" : Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml". : Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont : :* SECTION_TA / ID : identifiant de la section en cours :* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative" :* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte) :* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur) '''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles : Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative, Première partie : La propriété littéraire et artistique, Livre Ier : Le droit d'auteur, Titre Ier : Objet du droit d'auteur, Chapitre Ier : Nature du droit d'auteur. : Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont : :* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver :* SECTION_TA / STRUCTURE_TA / (LIENT_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent '''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" : Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867). : Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont : :* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent :* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique :* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01 :* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections :* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques :* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML :* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte [[Catégorie:Archéo Lex]] 7edcd22c2ab6003444daef2f8390402d52db69ee 41 40 2014-12-21T21:08:50Z Seb35 1 typo wikitext text/x-wiki Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (CPI) dont l’identifiant est LEGITEXT000006069414. De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres). '''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************". :Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414". :Ce dossier contient trois sous-dossiers : :* "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant :* "section_ta" : similaire aux articles, mais pour les sections (les titres de parties) :* "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles '''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml" : Pour le CPI, le fichier est "texte/version/LEGITEXT000006069414.xml". : Ce fichier XML les métadonnées générales du texte. Il contient les balises suivantes importantes : :* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article) :* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO de l’objet XML (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée en vigueur de l’objet XML, c’est-à-dire la date de référence pour les opérations de consolidation :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.) '''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml" : Pour le CPI, le fichier est "texte/struct/LEGITEXT000006069414.xml". : Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont : :* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code) :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI :* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont : :** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante :** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur :** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section :** le contenu de cette balise est le nom de la section '''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml" : Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml". : Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont : :* SECTION_TA / ID : identifiant de la section en cours :* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative" :* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte) :* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur) '''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles : Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative → Première partie : La propriété littéraire et artistique → Livre Ier : Le droit d'auteur → Titre Ier : Objet du droit d'auteur → Chapitre Ier : Nature du droit d'auteur. : Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont : :* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver :* SECTION_TA / STRUCTURE_TA / (LIENT_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent '''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" : Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867). : Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont : :* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent :* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique :* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01 :* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections :* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques :* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML :* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte [[Catégorie:Archéo Lex]] ee86e6ad5529c95d8c9d1b9ee4c3ddafae295c01 42 41 2014-12-21T23:48:30Z Seb35 1 typo wikitext text/x-wiki Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (CPI) dont l’identifiant est LEGITEXT000006069414. De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres). '''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************". :Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414". :Ce dossier contient trois sous-dossiers : :* "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant :* "section_ta" : similaire aux articles, mais pour les sections (les titres de parties) :* "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles '''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml" : Pour le CPI, le fichier est "texte/version/LEGITEXT000006069414.xml". : Ce fichier XML les métadonnées générales du texte. Il contient les balises suivantes importantes : :* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article) :* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO de l’objet XML (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée en vigueur de l’objet XML, c’est-à-dire la date de référence pour les opérations de consolidation :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.) '''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml" : Pour le CPI, le fichier est "texte/struct/LEGITEXT000006069414.xml". : Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont : :* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code) :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI :* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont : :** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante :** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur :** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section :** le contenu de cette balise est le nom de la section '''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml" : Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml". : Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont : :* SECTION_TA / ID : identifiant de la section en cours :* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative" :* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte) :* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur) '''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles : Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative → Première partie : La propriété littéraire et artistique → Livre Ier : Le droit d'auteur → Titre Ier : Objet du droit d'auteur → Chapitre Ier : Nature du droit d'auteur. : Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont : :* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver :* SECTION_TA / STRUCTURE_TA / (LIEN_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent '''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" : Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867). : Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont : :* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent :* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique :* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01 :* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections :* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques :* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML :* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte [[Catégorie:Archéo Lex]] 152d37d79bd0a67d2fab3f4c2a2b6a8390d621df 43 42 2014-12-22T09:52:53Z Seb35 1 +autres textes de LEGI wikitext text/x-wiki Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (CPI) dont l’identifiant est LEGITEXT000006069414. De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres). '''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************". :Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414". :Ce dossier contient trois sous-dossiers : :* "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant :* "section_ta" : similaire aux articles, mais pour les sections (les titres de parties) :* "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles '''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml" : Pour le CPI, le fichier est "texte/version/LEGITEXT000006069414.xml". : Ce fichier XML les métadonnées générales du texte. Il contient les balises suivantes importantes : :* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article) :* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO du texte (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée de signature du texte :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.) '''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml" : Pour le CPI, le fichier est "texte/struct/LEGITEXT000006069414.xml". : Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont : :* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code) :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI :* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont : :** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante :** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur :** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section :** le contenu de cette balise est le nom de la section '''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml" : Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml". : Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont : :* SECTION_TA / ID : identifiant de la section en cours :* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative" :* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte) :* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur) '''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles : Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative → Première partie : La propriété littéraire et artistique → Livre Ier : Le droit d'auteur → Titre Ier : Objet du droit d'auteur → Chapitre Ier : Nature du droit d'auteur. : Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont : :* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver :* SECTION_TA / STRUCTURE_TA / (LIEN_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent '''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" : Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867). : Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont : :* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent :* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique :* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01 :* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections :* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques :* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML :* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte Pour les lois, décrets, arrêtés et autres, la structure est similaire mais généralement plus simple puisqu’il n’y a pas de sections. Les lois sont dans le dossier "legi/global/code_et_TNC_en_vigueur/TNC_en_vigueur" (abréviation de "textes non codifiés") et sont transférées dans "legi/global/code_et_TNC_non_vigueur/TNC_non_vigueur" lorsqu’elles ne sont plus en vigueur (probablement comme les codes, mais ceux-ci ont une durée de vie longue). L’espace de noms "JORFTEXT" est plus difficile à explorer : il est étalé sur les sections TNC_en_vigueur et TNC_non_vigueur, il peut contenir des objets de l’espace de noms LEGITEXT. Le sous-dossier "texte/version" peut alors contenir un ou plusieurs fichiers LEGITEXT. [[Catégorie:Archéo Lex]] baa5174ee80c012d1667d0c371c39aaab0e02380 Catégorie:Archéo Lex 14 13 46 2014-12-22T14:05:34Z Seb35 1 création wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Fichier:BDD Archéo Lex.svg 6 14 48 2014-12-23T12:06:44Z Seb35 1 Seb35 a déplacé la page [[Fichier:BDD Archéo Lex.svg]] vers [[Fichier:BDD Archéo Lex 1.0.svg]] : numérotation de version wikitext text/x-wiki #REDIRECTION [[Fichier:BDD Archéo Lex 1.0.svg]] bcaf49df040798d319ffeb44d47f5e26bb7d98b4 Fichier:BDD Archéo Lex 2.1.svg 6 15 50 2014-12-23T12:09:46Z Seb35 1 Licence WTFPL 2.0 Version BDD : 2.0 wikitext text/x-wiki Licence WTFPL 2.0 Version BDD : 2.0 ae9c4b3047e013e2fb2376f9ab24779f5e09cc18 Archéo Lex/Base de données 0 10 51 49 2014-12-23T12:13:17Z Seb35 1 +schéma 2.0 wikitext text/x-wiki Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place. == Structure == La base de données comprend deux types d’informations : # la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ; # les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>. De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>. == Schéma SQL 1.0 == [[Fichier:BDD Archéo Lex 1.0.svg|center]] ; texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "texte" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE ); </syntaxhighlight> ; version_texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_texte" ( "id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id"); CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id"); </syntaxhighlight> ; section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "section" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid") ); CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id"); CREATE INDEX "section_texte_id" ON "section" ("texte_id"); </syntaxhighlight> ; version_section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_section" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id"); CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id"); CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id"); CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id"); </syntaxhighlight> ; article <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "article" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "article_texte_id" ON "article" ("texte_id"); CREATE INDEX "article_version_section_id" ON "article" ("version_section_id"); CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id"); </syntaxhighlight> == Schéma 2.0 == [[Fichier:BDD Archéo Lex 2.0.svg|center]] [[Catégorie:Archéo Lex]] 3a6d94102af6230fad3d698954267ceae72b4049 52 51 2014-12-23T13:49:35Z Seb35 1 /* Schéma 2.0 */ Explication du design de cette version de la base de données wikitext text/x-wiki Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place. == Structure == La base de données comprend deux types d’informations : # la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ; # les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>. De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>. == Schéma SQL 1.0 == [[Fichier:BDD Archéo Lex 1.0.svg|center]] ; texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "texte" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE ); </syntaxhighlight> ; version_texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_texte" ( "id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id"); CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id"); </syntaxhighlight> ; section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "section" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid") ); CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id"); CREATE INDEX "section_texte_id" ON "section" ("texte_id"); </syntaxhighlight> ; version_section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_section" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id"); CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id"); CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id"); CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id"); </syntaxhighlight> ; article <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "article" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "article_texte_id" ON "article" ("texte_id"); CREATE INDEX "article_version_section_id" ON "article" ("version_section_id"); CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id"); </syntaxhighlight> == Schéma SQL 2.0 == [[Fichier:BDD Archéo Lex 2.0.svg|center]] Cette version apporte principalement la prise en compte des livraisons, i.e. les mises à jour successives de la base LEGI. La version 1.0 de la base de données ne pouvait pas distinguer les livraisons et il aurait alors été nécessaire de modifier directement les divers enregistrements, ce qui aurait pu corrompu la base de donnée si le programme était arrêté au cours de la mise à jour. Cette version de la base de données voit principalement l’ajout de tables pour ces livraisons, ainsi que diverses modifications mineures améliorant la cohérence. Il y a donc deux axes d’évolution des versions manipulés par cette base de données : * l’axe temporel (naturel) : les différentes évolutions du texte au cours du temps, par exemple les modifications d’un texte ou les différentes versions consolidées d’un code ; cet axe existait déjà dans la version 1.0 de la base de données * l’axe des livraisons : l’introduction de nouvelles versions de textes à la suite de la version la plus récente (évolution normale), réécriture de versions existantes (en cas d’erreur sur un champ, faute de frappe, etc.), ajout ou suppression de versions intermédiaires (en cas d’erreur sur les dates de vigueur) Les deux axes d’évolution ne sont pas traités de façon identique mais s’inspirent des branches Git. Cela s’illustre par l’exemple suivant : Axe temporel → T1 T2 T3 T4 T5 T6 T7 T8 ↓ Axe des livraisons v1.0 v2.0 v3.0 v4.0 v5.0 -- livraison 0 : import initial \ `v6.1 -- livraison 1 : ajout d’une nouvelle version normale `v4.2 v5.2 v6.2 v7.2 -- livraison 2 : réécriture à partir de la version 4 `v7.3 v8.3 -- livraison 3 : introduction d’une version intermédiaire Du fait que les livraisons peuvent ajouter des versions intermédiaires sur l’axe temporel (cf livraison 2 dans l’exemple), il peut y avoir un décalage entre les numéros d’ordre des versions et leurs dates (cf dans l’exemple v7.2 et v8.3 qui n’ont pas le même numéro d’ordre (7 et 8) mais la même date (T8). En général, lorsqu’on comparera sur l’axe des livraisons, on préférera donc les comparaisons de versions à même date plutôt qu’à même numéro d’ordre. Les réécritures, introductions ou suppressions de versions intermédiaires peuvent être soit : * ''normales'' : dans le cas de la manipulation des versions à venir (postérieures à la date de la livraison), lorsqu’une loi introduit une nouvelle version consolidée intermédiaire ; ou * ''éditoriales'' : dans le cas de la manipulation des versions passées (antérieures à la date de la livraison), lorsqu’une erreur est corrigée ou que les dates de vigueur sont modifiées Cette version de la base de données ne distingue pas ces deux types de réécriture, mais cela sera probablement ajouté dans la version 3.0 de la base de données. Modifications de la base de données par rapport à la version 1.0 : * Ajouts, suppressions et modifications de tables : ** Ajout de la table <tt>livraison</tt> contenant les dates des livraisons, leur type ("fondation" (=dump complet) ou "miseajour" (=dump incrémental)) et un lien vers la livraison fondation le cas échéant ** Ajout de la table <tt>livraison_texte</tt> mettant en correspondance les textes, livraisons et versions de texte ** Ajout des tables <tt>liste_sections</tt> et <tt>liste_articles</tt> listant les sections et articles inclus dans une version de texte ; ce lien était auparavant fait directement dans <tt>version_section</tt> et <tt>article</tt> ** Retrait de la table <tt>section</tt>, inutilisée et inutile ** Renommage de la table <tt>article</tt> en <tt>version_article</tt> pour cohérence, puisque son rôle est identique à <tt>version_section</tt> * Transferts de colonnes entre tables : ** De <tt>texte</tt> à <tt>version_texte</tt> : <tt>nature</tt>, <tt>date_texte</tt>, <tt>date_publi</tt> : pour permettre la modification de ces champs d’une livraison à l’autre * Suppressions de colonnes : ** <tt>version_section</tt>/<tt>cid_id</tt> : car suppression de la table <tt>section</tt> ** <tt>version_section</tt>/<tt>version_texte_id</tt> et <tt>version_article</tt>/<tt>version_texte_id</tt> : il faut désormais passer par <tt>liste_sections</tt> et <tt>liste_articles</tt> * Renommage de colonnes : ** <tt>debut</tt> et <tt>fin</tt> renommés en <tt>vigueur_debut</tt> et <tt>vigueur_fin</tt> : plus explicite étant donné que de multiples dates sont indiquées et manipulées ** dans <tt>version_article</tt>, <tt>num</tt> en <tt>numero</tt> : plus explicite et cohérence avec <tt>version_section</tt> * Ajout de colonnes : ** <tt>version_texte</tt>/<tt>date_modif</tt> : date de dernière modification indiquée dans la base LEGI * Modifications de colonnes : ** dans <tt>version_texte</tt>, la colonne <tt>base_id</tt> (référent à la première version d’un texte sur l’axe temporel) est modifiée en <tt>version_prec_id</tt> (référent à la version précédente sur l’axe temporel) [[Catégorie:Archéo Lex]] 1e2e33baf094d4f24691c75f56b5069370c2c57d 53 52 2014-12-23T17:52:56Z Seb35 1 /* Schéma SQL 2.0 */ +opérations classiques wikitext text/x-wiki Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place. == Structure == La base de données comprend deux types d’informations : # la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ; # les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>. De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>. == Schéma SQL 1.0 == [[Fichier:BDD Archéo Lex 1.0.svg|center]] ; texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "texte" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE ); </syntaxhighlight> ; version_texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_texte" ( "id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id"); CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id"); </syntaxhighlight> ; section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "section" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid") ); CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id"); CREATE INDEX "section_texte_id" ON "section" ("texte_id"); </syntaxhighlight> ; version_section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_section" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id"); CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id"); CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id"); CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id"); </syntaxhighlight> ; article <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "article" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "article_texte_id" ON "article" ("texte_id"); CREATE INDEX "article_version_section_id" ON "article" ("version_section_id"); CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id"); </syntaxhighlight> == Schéma SQL 2.0 == === Graphique === [[Fichier:BDD Archéo Lex 2.0.svg|center]] === Aperçu général === Cette version apporte principalement la prise en compte des livraisons, i.e. les mises à jour successives de la base LEGI. La version 1.0 de la base de données ne pouvait pas distinguer les livraisons et il aurait alors été nécessaire de modifier directement les divers enregistrements, ce qui aurait pu corrompu la base de donnée si le programme était arrêté au cours de la mise à jour. Cette version de la base de données voit principalement l’ajout de tables pour ces livraisons, ainsi que diverses modifications mineures améliorant la cohérence. Il y a donc deux axes d’évolution des versions manipulés par cette base de données : * l’axe temporel (naturel) : les différentes évolutions du texte au cours du temps, par exemple les modifications d’un texte ou les différentes versions consolidées d’un code ; cet axe existait déjà dans la version 1.0 de la base de données * l’axe des livraisons : l’introduction de nouvelles versions de textes à la suite de la version la plus récente (évolution normale), réécriture de versions existantes (en cas d’erreur sur un champ, faute de frappe, etc.), ajout ou suppression de versions intermédiaires (en cas d’erreur sur les dates de vigueur) Les deux axes d’évolution ne sont pas traités de façon identique mais s’inspirent des branches Git. Cela s’illustre par l’exemple suivant : Axe temporel → T1 T2 T3 T4 T5 T6 T7 T8 ↓ Axe des livraisons v1.0 v2.0 v3.0 v4.0 v5.0 -- livraison 0 : import initial \ `v6.1 -- livraison 1 : ajout d’une nouvelle version normale `v4.2 v5.2 v6.2 v7.2 -- livraison 2 : réécriture à partir de la version 4 `v7.3 v8.3 -- livraison 3 : introduction d’une version intermédiaire Du fait que les livraisons peuvent ajouter des versions intermédiaires sur l’axe temporel (cf livraison 2 dans l’exemple), il peut y avoir un décalage entre les numéros d’ordre des versions et leurs dates (cf dans l’exemple v7.2 et v8.3 qui n’ont pas le même numéro d’ordre (7 et 8) mais la même date (T8). En général, lorsqu’on comparera sur l’axe des livraisons, on préférera donc les comparaisons de versions à même date plutôt qu’à même numéro d’ordre. Les réécritures, introductions ou suppressions de versions intermédiaires peuvent être soit : * ''normales'' : dans le cas de la manipulation des versions à venir (postérieures à la date de la livraison), lorsqu’une loi introduit une nouvelle version consolidée intermédiaire ; ou * ''éditoriales'' : dans le cas de la manipulation des versions passées (antérieures à la date de la livraison), lorsqu’une erreur est corrigée ou que les dates de vigueur sont modifiées Cette version de la base de données ne distingue pas ces deux types de réécriture, mais cela sera probablement ajouté dans la version 3.0 de la base de données. === Notes de modification === Modifications de la base de données par rapport à la version 1.0 : * Ajouts, suppressions et modifications de tables : ** Ajout de la table <tt>livraison</tt> contenant les dates des livraisons, leur type ("fondation" (=dump complet) ou "miseajour" (=dump incrémental)) et un lien vers la livraison fondation le cas échéant ** Ajout de la table <tt>livraison_texte</tt> mettant en correspondance les textes, livraisons et versions de texte ** Ajout des tables <tt>liste_sections</tt> et <tt>liste_articles</tt> listant les sections et articles inclus dans une version de texte ; ce lien était auparavant fait directement dans <tt>version_section</tt> et <tt>article</tt> ** Retrait de la table <tt>section</tt>, inutilisée et inutile ** Renommage de la table <tt>article</tt> en <tt>version_article</tt> pour cohérence, puisque son rôle est identique à <tt>version_section</tt> * Transferts de colonnes entre tables : ** De <tt>texte</tt> à <tt>version_texte</tt> : <tt>nature</tt>, <tt>date_texte</tt>, <tt>date_publi</tt> : pour permettre la modification de ces champs d’une livraison à l’autre * Suppressions de colonnes : ** <tt>version_section</tt>/<tt>cid_id</tt> : car suppression de la table <tt>section</tt> ** <tt>version_section</tt>/<tt>version_texte_id</tt> et <tt>version_article</tt>/<tt>version_texte_id</tt> : il faut désormais passer par <tt>liste_sections</tt> et <tt>liste_articles</tt> * Renommage de colonnes : ** <tt>debut</tt> et <tt>fin</tt> renommés en <tt>vigueur_debut</tt> et <tt>vigueur_fin</tt> : plus explicite étant donné que de multiples dates sont indiquées et manipulées ** dans <tt>version_article</tt>, <tt>num</tt> en <tt>numero</tt> : plus explicite et cohérence avec <tt>version_section</tt> * Ajout de colonnes : ** <tt>version_texte</tt>/<tt>date_modif</tt> : date de dernière modification indiquée dans la base LEGI * Modifications de colonnes : ** dans <tt>version_texte</tt>, la colonne <tt>base_id</tt> (référent à la première version d’un texte sur l’axe temporel) est modifiée en <tt>version_prec_id</tt> (référent à la version précédente sur l’axe temporel) === Opérations classiques === Les opérations classiques et prévues sur la base de données sont : * Création ''ex nihilo'' de la base de données : *# Insertion d’une ligne dans la table <tt>livraison</tt> *# Insertion d’une ou plusieurs lignes dans la table <tt>texte</tt> *# Calcul des versions de texte et insertion de celles-ci dans les tables <tt>version_{texte,section,article}</tt> *# Insertion des lignes adéquates dans les tables <tt>livraison_texte</tt> et <tt>liste_{sections,articles}</tt> * Mise à jour après une mise à jour incrémentale de la base LEGI : similaire au point précédent en n’ajoutant que les versions de textes, sections et articles nécessaires et en faisant les liens adéquats dans les tables livraison * Mise à jour après un dump complet de la base LEGI : similaire aux premier et deuxième points en n’ajoutant que ce qui n’existe pas * Requêter toutes les versions temporelles correspondant à une livraison : *# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les versions temporelles d’un texte *# Requête sur la table <tt>version_texte</tt> pour obtenir les métadonnées sur les versions temporelles *# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles *# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles * Requêter les versions temporelles à une date donnée pour toutes les livraisons : *# Requête sur la table <tt>version_texte</tt> en fixant le champ <tt>vigueur_debut</tt> (on peut aussi fixer <tt>vigueur_fin</tt> si on préfère ou même un intervalle temporel puisque la date est directement gérée par SQL) *# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les livraisons correspondantes à ces versions, si on veut *# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles *# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles Noter que pour la modification, l’ajout ou la suppression d’une section, il faut créer l’enregistrement dans <tt>version_section</tt>, puis créer des enregistrements de <tt>version_section</tt> pour toutes les sections enfants ainsi que les articles enfants, et ceci même si ceux-ci n’ont pas été changés. Cela est requis à cause du lien <tt>id_parent_id</tt> qui doit correspondre au nouveau élément. Je ne vois pas vraiment comment éviter cela, à part en créant une liste de sections ''alias'', c’est-à-dire que si une section enfant a un <tt>id_parent_id</tt> qui n’existe pas dans la <tt>liste_sections</tt> de cette version de texte, on cherchera le bon id de section dans une table <tt>alias_section</tt> (dans ce cas, ça serait juste pour les sections, pas pour les articles). === Design et évolutions futures === [[Catégorie:Archéo Lex]] 690c04c3ec0c99631202309d731cf6b4513d8c29 54 53 2014-12-23T18:00:37Z Seb35 1 /* Aperçu général */ précision wikitext text/x-wiki Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place. == Structure == La base de données comprend deux types d’informations : # la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ; # les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>. De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>. == Schéma SQL 1.0 == [[Fichier:BDD Archéo Lex 1.0.svg|center]] ; texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "texte" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE ); </syntaxhighlight> ; version_texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_texte" ( "id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id"); CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id"); </syntaxhighlight> ; section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "section" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid") ); CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id"); CREATE INDEX "section_texte_id" ON "section" ("texte_id"); </syntaxhighlight> ; version_section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_section" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id"); CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id"); CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id"); CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id"); </syntaxhighlight> ; article <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "article" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "article_texte_id" ON "article" ("texte_id"); CREATE INDEX "article_version_section_id" ON "article" ("version_section_id"); CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id"); </syntaxhighlight> == Schéma SQL 2.0 == === Graphique === [[Fichier:BDD Archéo Lex 2.0.svg|center]] === Aperçu général === Cette version apporte principalement la prise en compte des livraisons, i.e. les mises à jour successives de la base LEGI. La version 1.0 de la base de données ne pouvait pas distinguer les livraisons et il aurait alors été nécessaire de modifier directement les divers enregistrements, ce qui aurait pu corrompu la base de donnée si le programme était arrêté au cours de la mise à jour. Cette version de la base de données voit principalement l’ajout de tables pour ces livraisons, ainsi que diverses modifications mineures améliorant la cohérence. Il y a donc deux axes d’évolution des versions manipulés par cette base de données : * l’axe temporel (naturel) : les différentes évolutions du texte au cours du temps, par exemple les modifications d’un texte ou les différentes versions consolidées d’un code ; cet axe existait déjà dans la version 1.0 de la base de données et s’appuie entièrement sur les <u>dates de vigueur</u> * l’axe des livraisons : au fur et à mesure des livraisons (<u>tables livraison</u>) : introduction de nouvelles versions de textes à la suite de la version la plus récente (évolution normale), réécriture de versions existantes (en cas d’erreur sur un champ, faute de frappe, etc.), ajout ou suppression de versions intermédiaires (en cas d’erreur sur les dates de vigueur) Les deux axes d’évolution ne sont pas traités de façon identique mais s’inspirent des branches Git. Cela s’illustre par l’exemple suivant : Axe temporel → T1 T2 T3 T4 T5 T6 T7 T8 ↓ Axe des livraisons v1.0 v2.0 v3.0 v4.0 v5.0 -- livraison 0 : import initial \ `v6.1 -- livraison 1 : ajout d’une nouvelle version normale `v4.2 v5.2 v6.2 v7.2 -- livraison 2 : réécriture à partir de la version 4 `v7.3 v8.3 -- livraison 3 : introduction d’une version intermédiaire Du fait que les livraisons peuvent ajouter des versions intermédiaires sur l’axe temporel (cf livraison 2 dans l’exemple), il peut y avoir un décalage entre les numéros d’ordre des versions et leurs dates (cf dans l’exemple v7.2 et v8.3 qui n’ont pas le même numéro d’ordre (7 et 8) mais la même date (T8). En général, lorsqu’on comparera sur l’axe des livraisons, on préférera donc les comparaisons de versions à même date plutôt qu’à même numéro d’ordre. Les réécritures, introductions ou suppressions de versions intermédiaires peuvent être soit : * ''normales'' : dans le cas de la manipulation des versions à venir (postérieures à la date de la livraison), lorsqu’une loi introduit une nouvelle version consolidée intermédiaire ; ou * ''éditoriales'' : dans le cas de la manipulation des versions passées (antérieures à la date de la livraison), lorsqu’une erreur est corrigée ou que les dates de vigueur sont modifiées Cette version de la base de données ne distingue pas ces deux types de réécriture, mais cela sera probablement ajouté dans la version 3.0 de la base de données. === Notes de modification === Modifications de la base de données par rapport à la version 1.0 : * Ajouts, suppressions et modifications de tables : ** Ajout de la table <tt>livraison</tt> contenant les dates des livraisons, leur type ("fondation" (=dump complet) ou "miseajour" (=dump incrémental)) et un lien vers la livraison fondation le cas échéant ** Ajout de la table <tt>livraison_texte</tt> mettant en correspondance les textes, livraisons et versions de texte ** Ajout des tables <tt>liste_sections</tt> et <tt>liste_articles</tt> listant les sections et articles inclus dans une version de texte ; ce lien était auparavant fait directement dans <tt>version_section</tt> et <tt>article</tt> ** Retrait de la table <tt>section</tt>, inutilisée et inutile ** Renommage de la table <tt>article</tt> en <tt>version_article</tt> pour cohérence, puisque son rôle est identique à <tt>version_section</tt> * Transferts de colonnes entre tables : ** De <tt>texte</tt> à <tt>version_texte</tt> : <tt>nature</tt>, <tt>date_texte</tt>, <tt>date_publi</tt> : pour permettre la modification de ces champs d’une livraison à l’autre * Suppressions de colonnes : ** <tt>version_section</tt>/<tt>cid_id</tt> : car suppression de la table <tt>section</tt> ** <tt>version_section</tt>/<tt>version_texte_id</tt> et <tt>version_article</tt>/<tt>version_texte_id</tt> : il faut désormais passer par <tt>liste_sections</tt> et <tt>liste_articles</tt> * Renommage de colonnes : ** <tt>debut</tt> et <tt>fin</tt> renommés en <tt>vigueur_debut</tt> et <tt>vigueur_fin</tt> : plus explicite étant donné que de multiples dates sont indiquées et manipulées ** dans <tt>version_article</tt>, <tt>num</tt> en <tt>numero</tt> : plus explicite et cohérence avec <tt>version_section</tt> * Ajout de colonnes : ** <tt>version_texte</tt>/<tt>date_modif</tt> : date de dernière modification indiquée dans la base LEGI * Modifications de colonnes : ** dans <tt>version_texte</tt>, la colonne <tt>base_id</tt> (référent à la première version d’un texte sur l’axe temporel) est modifiée en <tt>version_prec_id</tt> (référent à la version précédente sur l’axe temporel) === Opérations classiques === Les opérations classiques et prévues sur la base de données sont : * Création ''ex nihilo'' de la base de données : *# Insertion d’une ligne dans la table <tt>livraison</tt> *# Insertion d’une ou plusieurs lignes dans la table <tt>texte</tt> *# Calcul des versions de texte et insertion de celles-ci dans les tables <tt>version_{texte,section,article}</tt> *# Insertion des lignes adéquates dans les tables <tt>livraison_texte</tt> et <tt>liste_{sections,articles}</tt> * Mise à jour après une mise à jour incrémentale de la base LEGI : similaire au point précédent en n’ajoutant que les versions de textes, sections et articles nécessaires et en faisant les liens adéquats dans les tables livraison * Mise à jour après un dump complet de la base LEGI : similaire aux premier et deuxième points en n’ajoutant que ce qui n’existe pas * Requêter toutes les versions temporelles correspondant à une livraison : *# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les versions temporelles d’un texte *# Requête sur la table <tt>version_texte</tt> pour obtenir les métadonnées sur les versions temporelles *# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles *# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles * Requêter les versions temporelles à une date donnée pour toutes les livraisons : *# Requête sur la table <tt>version_texte</tt> en fixant le champ <tt>vigueur_debut</tt> (on peut aussi fixer <tt>vigueur_fin</tt> si on préfère ou même un intervalle temporel puisque la date est directement gérée par SQL) *# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les livraisons correspondantes à ces versions, si on veut *# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles *# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles Noter que pour la modification, l’ajout ou la suppression d’une section, il faut créer l’enregistrement dans <tt>version_section</tt>, puis créer des enregistrements de <tt>version_section</tt> pour toutes les sections enfants ainsi que les articles enfants, et ceci même si ceux-ci n’ont pas été changés. Cela est requis à cause du lien <tt>id_parent_id</tt> qui doit correspondre au nouveau élément. Je ne vois pas vraiment comment éviter cela, à part en créant une liste de sections ''alias'', c’est-à-dire que si une section enfant a un <tt>id_parent_id</tt> qui n’existe pas dans la <tt>liste_sections</tt> de cette version de texte, on cherchera le bon id de section dans une table <tt>alias_section</tt> (dans ce cas, ça serait juste pour les sections, pas pour les articles). === Design et évolutions futures === [[Catégorie:Archéo Lex]] 58f98a34b580535f28da57f4f0e28eaf72d62a41 66 54 2014-12-28T21:05:07Z Seb35 1 déplacé vers github wikitext text/x-wiki <div align="center"><div style="background-color:#aeff00;border:2px solid #54ff00;opacity:0.8;padding:5px;display:inline-block;">Déplacé sur https://github.com/Seb35/Archeo-Lex/wiki/Base_de_données</div></div> Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place. == Structure == La base de données comprend deux types d’informations : # la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ; # les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>. De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>. == Schéma SQL 1.0 == [[Fichier:BDD Archéo Lex 1.0.svg|center]] ; texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "texte" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE ); </syntaxhighlight> ; version_texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_texte" ( "id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id"); CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id"); </syntaxhighlight> ; section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "section" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid") ); CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id"); CREATE INDEX "section_texte_id" ON "section" ("texte_id"); </syntaxhighlight> ; version_section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_section" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id"); CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id"); CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id"); CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id"); </syntaxhighlight> ; article <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "article" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "article_texte_id" ON "article" ("texte_id"); CREATE INDEX "article_version_section_id" ON "article" ("version_section_id"); CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id"); </syntaxhighlight> == Schéma SQL 2.0 == === Graphique === [[Fichier:BDD Archéo Lex 2.0.svg|center]] === Aperçu général === Cette version apporte principalement la prise en compte des livraisons, i.e. les mises à jour successives de la base LEGI. La version 1.0 de la base de données ne pouvait pas distinguer les livraisons et il aurait alors été nécessaire de modifier directement les divers enregistrements, ce qui aurait pu corrompu la base de donnée si le programme était arrêté au cours de la mise à jour. Cette version de la base de données voit principalement l’ajout de tables pour ces livraisons, ainsi que diverses modifications mineures améliorant la cohérence. Il y a donc deux axes d’évolution des versions manipulés par cette base de données : * l’axe temporel (naturel) : les différentes évolutions du texte au cours du temps, par exemple les modifications d’un texte ou les différentes versions consolidées d’un code ; cet axe existait déjà dans la version 1.0 de la base de données et s’appuie entièrement sur les <u>dates de vigueur</u> * l’axe des livraisons : au fur et à mesure des livraisons (<u>tables livraison</u>) : introduction de nouvelles versions de textes à la suite de la version la plus récente (évolution normale), réécriture de versions existantes (en cas d’erreur sur un champ, faute de frappe, etc.), ajout ou suppression de versions intermédiaires (en cas d’erreur sur les dates de vigueur) Les deux axes d’évolution ne sont pas traités de façon identique mais s’inspirent des branches Git. Cela s’illustre par l’exemple suivant : Axe temporel → T1 T2 T3 T4 T5 T6 T7 T8 ↓ Axe des livraisons v1.0 v2.0 v3.0 v4.0 v5.0 -- livraison 0 : import initial \ `v6.1 -- livraison 1 : ajout d’une nouvelle version normale `v4.2 v5.2 v6.2 v7.2 -- livraison 2 : réécriture à partir de la version 4 `v7.3 v8.3 -- livraison 3 : introduction d’une version intermédiaire Du fait que les livraisons peuvent ajouter des versions intermédiaires sur l’axe temporel (cf livraison 2 dans l’exemple), il peut y avoir un décalage entre les numéros d’ordre des versions et leurs dates (cf dans l’exemple v7.2 et v8.3 qui n’ont pas le même numéro d’ordre (7 et 8) mais la même date (T8). En général, lorsqu’on comparera sur l’axe des livraisons, on préférera donc les comparaisons de versions à même date plutôt qu’à même numéro d’ordre. Les réécritures, introductions ou suppressions de versions intermédiaires peuvent être soit : * ''normales'' : dans le cas de la manipulation des versions à venir (postérieures à la date de la livraison), lorsqu’une loi introduit une nouvelle version consolidée intermédiaire ; ou * ''éditoriales'' : dans le cas de la manipulation des versions passées (antérieures à la date de la livraison), lorsqu’une erreur est corrigée ou que les dates de vigueur sont modifiées Cette version de la base de données ne distingue pas ces deux types de réécriture, mais cela sera probablement ajouté dans la version 3.0 de la base de données. === Notes de modification === Modifications de la base de données par rapport à la version 1.0 : * Ajouts, suppressions et modifications de tables : ** Ajout de la table <tt>livraison</tt> contenant les dates des livraisons, leur type ("fondation" (=dump complet) ou "miseajour" (=dump incrémental)) et un lien vers la livraison fondation le cas échéant ** Ajout de la table <tt>livraison_texte</tt> mettant en correspondance les textes, livraisons et versions de texte ** Ajout des tables <tt>liste_sections</tt> et <tt>liste_articles</tt> listant les sections et articles inclus dans une version de texte ; ce lien était auparavant fait directement dans <tt>version_section</tt> et <tt>article</tt> ** Retrait de la table <tt>section</tt>, inutilisée et inutile ** Renommage de la table <tt>article</tt> en <tt>version_article</tt> pour cohérence, puisque son rôle est identique à <tt>version_section</tt> * Transferts de colonnes entre tables : ** De <tt>texte</tt> à <tt>version_texte</tt> : <tt>nature</tt>, <tt>date_texte</tt>, <tt>date_publi</tt> : pour permettre la modification de ces champs d’une livraison à l’autre * Suppressions de colonnes : ** <tt>version_section</tt>/<tt>cid_id</tt> : car suppression de la table <tt>section</tt> ** <tt>version_section</tt>/<tt>version_texte_id</tt> et <tt>version_article</tt>/<tt>version_texte_id</tt> : il faut désormais passer par <tt>liste_sections</tt> et <tt>liste_articles</tt> * Renommage de colonnes : ** <tt>debut</tt> et <tt>fin</tt> renommés en <tt>vigueur_debut</tt> et <tt>vigueur_fin</tt> : plus explicite étant donné que de multiples dates sont indiquées et manipulées ** dans <tt>version_article</tt>, <tt>num</tt> en <tt>numero</tt> : plus explicite et cohérence avec <tt>version_section</tt> * Ajout de colonnes : ** <tt>version_texte</tt>/<tt>date_modif</tt> : date de dernière modification indiquée dans la base LEGI * Modifications de colonnes : ** dans <tt>version_texte</tt>, la colonne <tt>base_id</tt> (référent à la première version d’un texte sur l’axe temporel) est modifiée en <tt>version_prec_id</tt> (référent à la version précédente sur l’axe temporel) === Opérations classiques === Les opérations classiques et prévues sur la base de données sont : * Création ''ex nihilo'' de la base de données : *# Insertion d’une ligne dans la table <tt>livraison</tt> *# Insertion d’une ou plusieurs lignes dans la table <tt>texte</tt> *# Calcul des versions de texte et insertion de celles-ci dans les tables <tt>version_{texte,section,article}</tt> *# Insertion des lignes adéquates dans les tables <tt>livraison_texte</tt> et <tt>liste_{sections,articles}</tt> * Mise à jour après une mise à jour incrémentale de la base LEGI : similaire au point précédent en n’ajoutant que les versions de textes, sections et articles nécessaires et en faisant les liens adéquats dans les tables livraison * Mise à jour après un dump complet de la base LEGI : similaire aux premier et deuxième points en n’ajoutant que ce qui n’existe pas * Requêter toutes les versions temporelles correspondant à une livraison : *# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les versions temporelles d’un texte *# Requête sur la table <tt>version_texte</tt> pour obtenir les métadonnées sur les versions temporelles *# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles *# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles * Requêter les versions temporelles à une date donnée pour toutes les livraisons : *# Requête sur la table <tt>version_texte</tt> en fixant le champ <tt>vigueur_debut</tt> (on peut aussi fixer <tt>vigueur_fin</tt> si on préfère ou même un intervalle temporel puisque la date est directement gérée par SQL) *# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les livraisons correspondantes à ces versions, si on veut *# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles *# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles Noter que pour la modification, l’ajout ou la suppression d’une section, il faut créer l’enregistrement dans <tt>version_section</tt>, puis créer des enregistrements de <tt>version_section</tt> pour toutes les sections enfants ainsi que les articles enfants, et ceci même si ceux-ci n’ont pas été changés. Cela est requis à cause du lien <tt>id_parent_id</tt> qui doit correspondre au nouveau élément. Je ne vois pas vraiment comment éviter cela, à part en créant une liste de sections ''alias'', c’est-à-dire que si une section enfant a un <tt>id_parent_id</tt> qui n’existe pas dans la <tt>liste_sections</tt> de cette version de texte, on cherchera le bon id de section dans une table <tt>alias_section</tt> (dans ce cas, ça serait juste pour les sections, pas pour les articles). === Design et évolutions futures === [[Catégorie:Archéo Lex]] 5bfaa4da2bbb8f924c594f88bc20b7db32d10d2b 89 66 2015-02-11T16:20:39Z Seb35 1 +modèle Transféré wikitext text/x-wiki {{Transféré|https://github.com/Seb35/Archeo-Lex/wiki/Base_de_données}} Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place. == Structure == La base de données comprend deux types d’informations : # la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ; # les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>. De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>. == Schéma SQL 1.0 == [[Fichier:BDD Archéo Lex 1.0.svg|center]] ; texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "texte" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE ); </syntaxhighlight> ; version_texte <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_texte" ( "id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id"); CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id"); </syntaxhighlight> ; section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "section" ( "cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid") ); CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id"); CREATE INDEX "section_texte_id" ON "section" ("texte_id"); </syntaxhighlight> ; version_section <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "version_section" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id"); CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id"); CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id"); CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id"); </syntaxhighlight> ; article <syntaxhighlight lang="sql" enclose="div"> CREATE TABLE "article" ( "id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id") ); CREATE INDEX "article_texte_id" ON "article" ("texte_id"); CREATE INDEX "article_version_section_id" ON "article" ("version_section_id"); CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id"); </syntaxhighlight> == Schéma SQL 2.0 == === Graphique === [[Fichier:BDD Archéo Lex 2.0.svg|center]] === Aperçu général === Cette version apporte principalement la prise en compte des livraisons, i.e. les mises à jour successives de la base LEGI. La version 1.0 de la base de données ne pouvait pas distinguer les livraisons et il aurait alors été nécessaire de modifier directement les divers enregistrements, ce qui aurait pu corrompu la base de donnée si le programme était arrêté au cours de la mise à jour. Cette version de la base de données voit principalement l’ajout de tables pour ces livraisons, ainsi que diverses modifications mineures améliorant la cohérence. Il y a donc deux axes d’évolution des versions manipulés par cette base de données : * l’axe temporel (naturel) : les différentes évolutions du texte au cours du temps, par exemple les modifications d’un texte ou les différentes versions consolidées d’un code ; cet axe existait déjà dans la version 1.0 de la base de données et s’appuie entièrement sur les <u>dates de vigueur</u> * l’axe des livraisons : au fur et à mesure des livraisons (<u>tables livraison</u>) : introduction de nouvelles versions de textes à la suite de la version la plus récente (évolution normale), réécriture de versions existantes (en cas d’erreur sur un champ, faute de frappe, etc.), ajout ou suppression de versions intermédiaires (en cas d’erreur sur les dates de vigueur) Les deux axes d’évolution ne sont pas traités de façon identique mais s’inspirent des branches Git. Cela s’illustre par l’exemple suivant : Axe temporel → T1 T2 T3 T4 T5 T6 T7 T8 ↓ Axe des livraisons v1.0 v2.0 v3.0 v4.0 v5.0 -- livraison 0 : import initial \ `v6.1 -- livraison 1 : ajout d’une nouvelle version normale `v4.2 v5.2 v6.2 v7.2 -- livraison 2 : réécriture à partir de la version 4 `v7.3 v8.3 -- livraison 3 : introduction d’une version intermédiaire Du fait que les livraisons peuvent ajouter des versions intermédiaires sur l’axe temporel (cf livraison 2 dans l’exemple), il peut y avoir un décalage entre les numéros d’ordre des versions et leurs dates (cf dans l’exemple v7.2 et v8.3 qui n’ont pas le même numéro d’ordre (7 et 8) mais la même date (T8). En général, lorsqu’on comparera sur l’axe des livraisons, on préférera donc les comparaisons de versions à même date plutôt qu’à même numéro d’ordre. Les réécritures, introductions ou suppressions de versions intermédiaires peuvent être soit : * ''normales'' : dans le cas de la manipulation des versions à venir (postérieures à la date de la livraison), lorsqu’une loi introduit une nouvelle version consolidée intermédiaire ; ou * ''éditoriales'' : dans le cas de la manipulation des versions passées (antérieures à la date de la livraison), lorsqu’une erreur est corrigée ou que les dates de vigueur sont modifiées Cette version de la base de données ne distingue pas ces deux types de réécriture, mais cela sera probablement ajouté dans la version 3.0 de la base de données. === Notes de modification === Modifications de la base de données par rapport à la version 1.0 : * Ajouts, suppressions et modifications de tables : ** Ajout de la table <tt>livraison</tt> contenant les dates des livraisons, leur type ("fondation" (=dump complet) ou "miseajour" (=dump incrémental)) et un lien vers la livraison fondation le cas échéant ** Ajout de la table <tt>livraison_texte</tt> mettant en correspondance les textes, livraisons et versions de texte ** Ajout des tables <tt>liste_sections</tt> et <tt>liste_articles</tt> listant les sections et articles inclus dans une version de texte ; ce lien était auparavant fait directement dans <tt>version_section</tt> et <tt>article</tt> ** Retrait de la table <tt>section</tt>, inutilisée et inutile ** Renommage de la table <tt>article</tt> en <tt>version_article</tt> pour cohérence, puisque son rôle est identique à <tt>version_section</tt> * Transferts de colonnes entre tables : ** De <tt>texte</tt> à <tt>version_texte</tt> : <tt>nature</tt>, <tt>date_texte</tt>, <tt>date_publi</tt> : pour permettre la modification de ces champs d’une livraison à l’autre * Suppressions de colonnes : ** <tt>version_section</tt>/<tt>cid_id</tt> : car suppression de la table <tt>section</tt> ** <tt>version_section</tt>/<tt>version_texte_id</tt> et <tt>version_article</tt>/<tt>version_texte_id</tt> : il faut désormais passer par <tt>liste_sections</tt> et <tt>liste_articles</tt> * Renommage de colonnes : ** <tt>debut</tt> et <tt>fin</tt> renommés en <tt>vigueur_debut</tt> et <tt>vigueur_fin</tt> : plus explicite étant donné que de multiples dates sont indiquées et manipulées ** dans <tt>version_article</tt>, <tt>num</tt> en <tt>numero</tt> : plus explicite et cohérence avec <tt>version_section</tt> * Ajout de colonnes : ** <tt>version_texte</tt>/<tt>date_modif</tt> : date de dernière modification indiquée dans la base LEGI * Modifications de colonnes : ** dans <tt>version_texte</tt>, la colonne <tt>base_id</tt> (référent à la première version d’un texte sur l’axe temporel) est modifiée en <tt>version_prec_id</tt> (référent à la version précédente sur l’axe temporel) === Opérations classiques === Les opérations classiques et prévues sur la base de données sont : * Création ''ex nihilo'' de la base de données : *# Insertion d’une ligne dans la table <tt>livraison</tt> *# Insertion d’une ou plusieurs lignes dans la table <tt>texte</tt> *# Calcul des versions de texte et insertion de celles-ci dans les tables <tt>version_{texte,section,article}</tt> *# Insertion des lignes adéquates dans les tables <tt>livraison_texte</tt> et <tt>liste_{sections,articles}</tt> * Mise à jour après une mise à jour incrémentale de la base LEGI : similaire au point précédent en n’ajoutant que les versions de textes, sections et articles nécessaires et en faisant les liens adéquats dans les tables livraison * Mise à jour après un dump complet de la base LEGI : similaire aux premier et deuxième points en n’ajoutant que ce qui n’existe pas * Requêter toutes les versions temporelles correspondant à une livraison : *# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les versions temporelles d’un texte *# Requête sur la table <tt>version_texte</tt> pour obtenir les métadonnées sur les versions temporelles *# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles *# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles * Requêter les versions temporelles à une date donnée pour toutes les livraisons : *# Requête sur la table <tt>version_texte</tt> en fixant le champ <tt>vigueur_debut</tt> (on peut aussi fixer <tt>vigueur_fin</tt> si on préfère ou même un intervalle temporel puisque la date est directement gérée par SQL) *# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les livraisons correspondantes à ces versions, si on veut *# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles *# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles Noter que pour la modification, l’ajout ou la suppression d’une section, il faut créer l’enregistrement dans <tt>version_section</tt>, puis créer des enregistrements de <tt>version_section</tt> pour toutes les sections enfants ainsi que les articles enfants, et ceci même si ceux-ci n’ont pas été changés. Cela est requis à cause du lien <tt>id_parent_id</tt> qui doit correspondre au nouveau élément. Je ne vois pas vraiment comment éviter cela, à part en créant une liste de sections ''alias'', c’est-à-dire que si une section enfant a un <tt>id_parent_id</tt> qui n’existe pas dans la <tt>liste_sections</tt> de cette version de texte, on cherchera le bon id de section dans une table <tt>alias_section</tt> (dans ce cas, ça serait juste pour les sections, pas pour les articles). === Design et évolutions futures === [[Catégorie:Archéo Lex]] fd37af41d38d0c3ba54489b770dbe11c112ec667 Fichier:BDD Archéo Lex 1.0.svg 6 11 55 47 2014-12-23T22:40:13Z Seb35 1 Seb35 a importé une nouvelle version de « [[Fichier:BDD Archéo Lex 1.0.svg]] » wikitext text/x-wiki Licence WTFPL 2.0 Version BDD : 1.0 27795a057532cde04720376daa498a67506a83c4 Archéo Lex/archeo-lex.fr 0 16 56 2014-12-27T00:19:01Z Seb35 1 création structure du site wikitext text/x-wiki Le site [http://archeo-lex.fr archeo-lex.fr] rassemble les codes de lois français issus du programme Archéo Lex. == Structure et URLs == * [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale * [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code Prévu: * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates * [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée [[Catégorie:Archéo Lex]] de1d0572065f94623f5bbde6ab895c3d7335955d 57 56 2014-12-27T09:25:43Z Seb35 1 +1 url d’un commit wikitext text/x-wiki Le site [http://archeo-lex.fr archeo-lex.fr] rassemble les codes de lois français issus du programme Archéo Lex. == Structure et URLs == * [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale * [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique Prévu: * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates * [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée [[Catégorie:Archéo Lex]] 60fadc5eac9bb59f35c6c12ebcf0ff8410c1e626 58 57 2014-12-27T09:26:57Z Seb35 1 +belle url d’une version wikitext text/x-wiki Le site [http://archeo-lex.fr archeo-lex.fr] rassemble les codes de lois français issus du programme Archéo Lex. == Structure et URLs == * [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale * [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique Prévu: * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30] Une version spécifique * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates * [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée [[Catégorie:Archéo Lex]] 51ad56edd6748fd9f7831a3b12e7fcfa81f2ce1e 59 58 2014-12-27T09:28:38Z Seb35 1 typo wikitext text/x-wiki Le site [http://archeo-lex.fr archeo-lex.fr] rassemble les codes de lois français issus du programme Archéo Lex. == Structure et URLs == * [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale * [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique Prévu: * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30] Une version spécifique * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates * [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/2014-08-01/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée [[Catégorie:Archéo Lex]] 0e254baf2ec745ce1511f9786a31010d89905b65 60 59 2014-12-27T09:46:10Z Seb35 1 meilleure intro wikitext text/x-wiki Le site [http://archeo-lex.fr archeo-lex.fr] est une vitrine du programme Archéo Lex, qui en soit n’est qu’un programme de traitement et n’est ni visuel, ni utilisable par des non-informaticiens. Ainsi, ce site rend les résultats d’Archéo Lex réellement utilisable par la communauté de l’information légale. Le site est hébergé sur mon serveur personel (un DreamPlug, i.e. un micro-serveur) derrière une ligne ADSL. S’il nécessite plus de ressources, je le déplacerai sur un vrai serveur plus puissant avec une meilleure connexion (si vous avez un bout de serveur de dispo pour le site archeo-lex.fr, je suis intéressé). == Structure et URLs == * [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale * [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique Prévu: * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30] Une version spécifique * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates * [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/2014-08-01/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée [[Catégorie:Archéo Lex]] 21285cbf5a358826bc64c9501dbe45380ee5215e 61 60 2014-12-27T10:26:47Z Seb35 1 +lien gitlist wikitext text/x-wiki Le site [http://archeo-lex.fr archeo-lex.fr] est une vitrine du programme Archéo Lex, qui en soit n’est qu’un programme de traitement et n’est ni visuel, ni utilisable par des non-informaticiens. Ainsi, ce site rend les résultats d’Archéo Lex réellement utilisable par la communauté de l’information légale. Le site est hébergé sur mon serveur personel (un DreamPlug, i.e. un micro-serveur) derrière une ligne ADSL. S’il nécessite plus de ressources, je le déplacerai sur un vrai serveur plus puissant avec une meilleure connexion (si vous avez un bout de serveur de dispo pour le site archeo-lex.fr, je suis intéressé). L’interface web de Git est [http://gitlist.org GitList], que je trouve assez utilisable et jolie, en plus d’être proche de celle de GitHub (elle-même jolie et utilisable). == Structure et URLs == * [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale * [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique Prévu: * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30] Une version spécifique * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates * [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/2014-08-01/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée [[Catégorie:Archéo Lex]] d8be2f6fc3d983a27b6a9bf714ba63a73d4c234f 63 61 2014-12-28T12:49:31Z Seb35 1 +bandeau déplacé sur github.com wikitext text/x-wiki <div align="center"><div style="background-color:#aeff00;border:2px solid #54ff00;opacity:0.8;padding:5px;display:inline-block;">Déplacé sur https://github.com/Seb35/Archeo-Lex/wiki/archeo-lex.fr</div></div> Le site [http://archeo-lex.fr archeo-lex.fr] est une vitrine du programme Archéo Lex, qui en soit n’est qu’un programme de traitement et n’est ni visuel, ni utilisable par des non-informaticiens. Ainsi, ce site rend les résultats d’Archéo Lex réellement utilisable par la communauté de l’information légale. Le site est hébergé sur mon serveur personel (un DreamPlug, i.e. un micro-serveur) derrière une ligne ADSL. S’il nécessite plus de ressources, je le déplacerai sur un vrai serveur plus puissant avec une meilleure connexion (si vous avez un bout de serveur de dispo pour le site archeo-lex.fr, je suis intéressé). L’interface web de Git est [http://gitlist.org GitList], que je trouve assez utilisable et jolie, en plus d’être proche de celle de GitHub (elle-même jolie et utilisable). == Structure et URLs == * [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale * [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique Prévu: * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30] Une version spécifique * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates * [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/2014-08-01/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée [[Catégorie:Archéo Lex]] 29614ea65af774b96519d307fea74f5121333ee5 91 63 2015-02-11T16:21:47Z Seb35 1 +modèle Transféré wikitext text/x-wiki {{Transféré|https://github.com/Seb35/Archeo-Lex/wiki/archeo-lex.fr}} Le site [http://archeo-lex.fr archeo-lex.fr] est une vitrine du programme Archéo Lex, qui en soit n’est qu’un programme de traitement et n’est ni visuel, ni utilisable par des non-informaticiens. Ainsi, ce site rend les résultats d’Archéo Lex réellement utilisable par la communauté de l’information légale. Le site est hébergé sur mon serveur personel (un DreamPlug, i.e. un micro-serveur) derrière une ligne ADSL. S’il nécessite plus de ressources, je le déplacerai sur un vrai serveur plus puissant avec une meilleure connexion (si vous avez un bout de serveur de dispo pour le site archeo-lex.fr, je suis intéressé). L’interface web de Git est [http://gitlist.org GitList], que je trouve assez utilisable et jolie, en plus d’être proche de celle de GitHub (elle-même jolie et utilisable). == Structure et URLs == * [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale * [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code ** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique Prévu: * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30] Une version spécifique * [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates * [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/2014-08-01/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée [[Catégorie:Archéo Lex]] 2476e6b6404b02909ab9b2302f3600cc198c830f Archéo Lex/Ressources externes 0 17 62 2014-12-28T11:19:49Z Seb35 1 recensement de quelques liens wikitext text/x-wiki == Git == === Tutoriels === * [http://rogerdudler.github.io/git-guide/index.fr.html Guide rapide d’introduction à Git], multilingue dont français, contient des installeurs Windows et Mac OS X * [http://doc.ubuntu-fr.org/git Guide sur ubuntu-fr.org], en particulier plusieurs liens externes === Livres === * [http://git-scm.com/book/en/v2/ Livre officiel] en anglais (version 2) * [http://git-scm.com/book/fr/ Livre officiel] en français (version 1) === Logiciels === ==== Pour Linux ==== ==== Pour Mac OS X ==== * [https://code.google.com/p/git-osx-installer/downloads/list?can=3 Installeur pour Mac OS X] ==== Pour Windows ==== * [http://msysgit.github.io/ Installeur pour Windows] == GitList == * [http://gitlist.org gitlist.org] * [https://github.com/klaussilveira/gitlist github.com:klaussilveira/gitlist] * [http://weininger.net/configuration-of-nginx-for-gitweb-and-git-http-backend.html nginx+Git+Git viewer] pour faire cohabiter les URLs du Git viewer et du protocole Git, avec nginx 84d0792133dd3c3687aa4ea65b064c17e93b0199 65 62 2014-12-28T20:10:17Z Seb35 1 déplacé sur github wikitext text/x-wiki <div align="center"><div style="background-color:#aeff00;border:2px solid #54ff00;opacity:0.8;padding:5px;display:inline-block;">Déplacé sur https://github.com/Seb35/Archeo-Lex/wiki/Ressources_externes</div></div> == Git == === Tutoriels === * [http://rogerdudler.github.io/git-guide/index.fr.html Guide rapide d’introduction à Git], multilingue dont français, contient des installeurs Windows et Mac OS X * [http://doc.ubuntu-fr.org/git Guide sur ubuntu-fr.org], en particulier plusieurs liens externes === Livres === * [http://git-scm.com/book/en/v2/ Livre officiel] en anglais (version 2) * [http://git-scm.com/book/fr/ Livre officiel] en français (version 1) === Logiciels === ==== Pour Linux ==== ==== Pour Mac OS X ==== * [https://code.google.com/p/git-osx-installer/downloads/list?can=3 Installeur pour Mac OS X] ==== Pour Windows ==== * [http://msysgit.github.io/ Installeur pour Windows] == GitList == * [http://gitlist.org gitlist.org] * [https://github.com/klaussilveira/gitlist github.com:klaussilveira/gitlist] * [http://weininger.net/configuration-of-nginx-for-gitweb-and-git-http-backend.html nginx+Git+Git viewer] pour faire cohabiter les URLs du Git viewer et du protocole Git, avec nginx 210d6c17d1bc504c4954d277d07f7e9fc3f4582f 92 65 2015-02-11T16:22:16Z Seb35 1 +modèle Transféré wikitext text/x-wiki {{Transféré|https://github.com/Seb35/Archeo-Lex/wiki/Ressources_externes}} == Git == === Tutoriels === * [http://rogerdudler.github.io/git-guide/index.fr.html Guide rapide d’introduction à Git], multilingue dont français, contient des installeurs Windows et Mac OS X * [http://doc.ubuntu-fr.org/git Guide sur ubuntu-fr.org], en particulier plusieurs liens externes === Livres === * [http://git-scm.com/book/en/v2/ Livre officiel] en anglais (version 2) * [http://git-scm.com/book/fr/ Livre officiel] en français (version 1) === Logiciels === ==== Pour Linux ==== ==== Pour Mac OS X ==== * [https://code.google.com/p/git-osx-installer/downloads/list?can=3 Installeur pour Mac OS X] ==== Pour Windows ==== * [http://msysgit.github.io/ Installeur pour Windows] == GitList == * [http://gitlist.org gitlist.org] * [https://github.com/klaussilveira/gitlist github.com:klaussilveira/gitlist] * [http://weininger.net/configuration-of-nginx-for-gitweb-and-git-http-backend.html nginx+Git+Git viewer] pour faire cohabiter les URLs du Git viewer et du protocole Git, avec nginx 6297aeebaf9f2954f148f61b4c80bbcf9d44ffb3 Archéo Lex/Base LEGI 0 12 64 43 2014-12-28T12:50:10Z Seb35 1 +bandeau déplacé sur github.com wikitext text/x-wiki <div align="center"><div style="background-color:#aeff00;border:2px solid #54ff00;opacity:0.8;padding:5px;display:inline-block;">Déplacé sur https://github.com/Seb35/Archeo-Lex/wiki/Base_LEGI</div></div> Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (CPI) dont l’identifiant est LEGITEXT000006069414. De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres). '''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************". :Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414". :Ce dossier contient trois sous-dossiers : :* "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant :* "section_ta" : similaire aux articles, mais pour les sections (les titres de parties) :* "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles '''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml" : Pour le CPI, le fichier est "texte/version/LEGITEXT000006069414.xml". : Ce fichier XML les métadonnées générales du texte. Il contient les balises suivantes importantes : :* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article) :* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO du texte (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée de signature du texte :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.) '''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml" : Pour le CPI, le fichier est "texte/struct/LEGITEXT000006069414.xml". : Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont : :* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code) :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI :* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont : :** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante :** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur :** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section :** le contenu de cette balise est le nom de la section '''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml" : Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml". : Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont : :* SECTION_TA / ID : identifiant de la section en cours :* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative" :* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte) :* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur) '''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles : Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative → Première partie : La propriété littéraire et artistique → Livre Ier : Le droit d'auteur → Titre Ier : Objet du droit d'auteur → Chapitre Ier : Nature du droit d'auteur. : Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont : :* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver :* SECTION_TA / STRUCTURE_TA / (LIEN_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent '''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" : Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867). : Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont : :* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent :* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique :* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01 :* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections :* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques :* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML :* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte Pour les lois, décrets, arrêtés et autres, la structure est similaire mais généralement plus simple puisqu’il n’y a pas de sections. Les lois sont dans le dossier "legi/global/code_et_TNC_en_vigueur/TNC_en_vigueur" (abréviation de "textes non codifiés") et sont transférées dans "legi/global/code_et_TNC_non_vigueur/TNC_non_vigueur" lorsqu’elles ne sont plus en vigueur (probablement comme les codes, mais ceux-ci ont une durée de vie longue). L’espace de noms "JORFTEXT" est plus difficile à explorer : il est étalé sur les sections TNC_en_vigueur et TNC_non_vigueur, il peut contenir des objets de l’espace de noms LEGITEXT. Le sous-dossier "texte/version" peut alors contenir un ou plusieurs fichiers LEGITEXT. [[Catégorie:Archéo Lex]] 55b9bf3c5ddc48d84d3884fd36e4e8e1daff4b68 90 64 2015-02-11T16:21:20Z Seb35 1 +modèle Transféré wikitext text/x-wiki {{Transféré|https://github.com/Seb35/Archeo-Lex/wiki/Base_LEGI}} Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (CPI) dont l’identifiant est LEGITEXT000006069414. De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres). '''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************". :Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414". :Ce dossier contient trois sous-dossiers : :* "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant :* "section_ta" : similaire aux articles, mais pour les sections (les titres de parties) :* "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles '''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml" : Pour le CPI, le fichier est "texte/version/LEGITEXT000006069414.xml". : Ce fichier XML les métadonnées générales du texte. Il contient les balises suivantes importantes : :* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article) :* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO du texte (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles) :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée de signature du texte :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle" :* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.) '''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml" : Pour le CPI, le fichier est "texte/struct/LEGITEXT000006069414.xml". : Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont : :* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code) :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur :* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI :* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont : :** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante :** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur :** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section :** le contenu de cette balise est le nom de la section '''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml" : Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml". : Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont : :* SECTION_TA / ID : identifiant de la section en cours :* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative" :* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte) :* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur) '''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles : Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative → Première partie : La propriété littéraire et artistique → Livre Ier : Le droit d'auteur → Titre Ier : Objet du droit d'auteur → Chapitre Ier : Nature du droit d'auteur. : Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont : :* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver :* SECTION_TA / STRUCTURE_TA / (LIEN_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent '''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" : Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867). : Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont : :* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent :* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique :* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01 :* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections :* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques :* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML :* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte Pour les lois, décrets, arrêtés et autres, la structure est similaire mais généralement plus simple puisqu’il n’y a pas de sections. Les lois sont dans le dossier "legi/global/code_et_TNC_en_vigueur/TNC_en_vigueur" (abréviation de "textes non codifiés") et sont transférées dans "legi/global/code_et_TNC_non_vigueur/TNC_non_vigueur" lorsqu’elles ne sont plus en vigueur (probablement comme les codes, mais ceux-ci ont une durée de vie longue). L’espace de noms "JORFTEXT" est plus difficile à explorer : il est étalé sur les sections TNC_en_vigueur et TNC_non_vigueur, il peut contenir des objets de l’espace de noms LEGITEXT. Le sous-dossier "texte/version" peut alors contenir un ou plusieurs fichiers LEGITEXT. [[Catégorie:Archéo Lex]] f5cca9d720d3d627d122d04d9bee1a7af3d2faf6 Fichier:BDD Archéo Lex 2.1.svg 6 15 67 50 2015-01-14T14:09:53Z Seb35 1 màj wikitext text/x-wiki Licence WTFPL 2.0 Version BDD : 2.1 a765e8e892d982528dbac3605dedd8bdb54963f6 68 67 2015-01-14T14:10:39Z Seb35 1 Seb35 a importé une nouvelle version de « [[Fichier:BDD Archéo Lex 2.0.svg]] » wikitext text/x-wiki Licence WTFPL 2.0 Version BDD : 2.1 a765e8e892d982528dbac3605dedd8bdb54963f6 69 68 2015-01-14T14:11:57Z Seb35 1 Seb35 a déplacé la page [[Fichier:BDD Archéo Lex 2.0.svg]] vers [[Fichier:BDD Archéo Lex 2.1.svg]] wikitext text/x-wiki Licence WTFPL 2.0 Version BDD : 2.1 a765e8e892d982528dbac3605dedd8bdb54963f6 Fichier:BDD Archéo Lex 2.0.svg 6 18 70 2015-01-14T14:11:57Z Seb35 1 Seb35 a déplacé la page [[Fichier:BDD Archéo Lex 2.0.svg]] vers [[Fichier:BDD Archéo Lex 2.1.svg]] wikitext text/x-wiki #REDIRECTION [[Fichier:BDD Archéo Lex 2.1.svg]] c9ab073440f25ac572fc58f00d288a3db24fa984 Accueil 0 1 71 28 2015-01-29T11:58:29Z Seb35 1 intro wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. == Pages du wiki == {{Special:Allpages}} ee4799a788b5b993c4b636ef4c51dc3eaec13bef 93 71 2015-02-11T16:25:37Z Seb35 1 présentation des pages wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. == Pages du wiki == === Tutoriaux === {{Special:Allpages/Tutorial:}} === Autres === * [[Archéo Lex]] * [[Syntaxes de formatage léger]] 2730cbd8d24397d1c9e7c70dba584b316ff08613 Tutorial:Beautiful MediaWiki URLs 102 178 72 27 2015-02-11T15:07:06Z Seb35 1 Seb35 a déplacé la page [[Learning:Beautiful MediaWiki URLs]] vers [[Tutorial:Beautiful MediaWiki URLs]] : plus propre wikitext text/x-wiki This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit ''instead of'' :{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/维基百科?action=history ''instead of'' :{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :) == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital). # Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. 9850067e9de9dce5badf5078964cb00619f2f54e 75 72 2015-02-11T15:22:08Z Seb35 1 +tutorial template wikitext text/x-wiki {{Tutorial|lang=en|status=stable}} This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit ''instead of'' :{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :{{SERVER}}/维基百科?action=history ''instead of'' :{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :) == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital). # Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. 1d97d05cc36e8cd4f1c056bd771ea04f78d35cf3 76 75 2015-02-11T15:55:30Z Seb35 1 protocol-relative wikitext text/x-wiki {{Tutorial|lang=en|status=stable}} This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :[{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit http://{{SERVERNAME}}/Learning:Beautiful_MediaWiki_URLs?action=edit] ''instead of'' :[{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit http://{{SERVERNAME}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit] </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :[{{SERVER}}/维基百科?action=history http://{{SERVERNAME}}/维基百科?action=history] ''instead of'' :[{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history http://{{SERVERNAME}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history] </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :) == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital). # Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. 8c4e450ab4221fe9867e64a5784f74da2402a854 Learning:Beautiful MediaWiki URLs 0 19 73 2015-02-11T15:07:07Z Seb35 1 Seb35 a déplacé la page [[Learning:Beautiful MediaWiki URLs]] vers [[Tutorial:Beautiful MediaWiki URLs]] : plus propre wikitext text/x-wiki #REDIRECTION [[Tutorial:Beautiful MediaWiki URLs]] dc22f432875ad97f31b7e93b81fc5f66adfa80c9 Modèle:Tutorial 10 20 74 2015-02-11T15:20:43Z Seb35 1 création wikitext text/x-wiki <div style="top:0px; right:0px; float:right; z-index:0; background-color:white; border:1px solid black; padding: 0px 10px;"> Langue : {{{lang|fr}}}<br /> Statut : {{{status|stable}}} </div> 65c7d3502fb90581fef7dc523ed05ad3628539f0 78 74 2015-02-11T16:00:47Z Seb35 1 +catégories wikitext text/x-wiki <div style="top:0px; right:0px; float:right; z-index:0; background-color:white; border:1px solid black; padding: 0px 10px;"> Langue : {{{lang|fr}}}<br /> Statut : {{{status|stable}}} </div> [[Catégorie:{{{lang|fr}}}]] [[Catégorie:{{{status|stable}}}]] d61c60431da77033fa2d9341a1c409c5babd232a 83 78 2015-02-11T16:14:05Z Seb35 1 contraintes sur les paramètres wikitext text/x-wiki <div style="top:0px; right:0px; float:right; z-index:0; background-color:white; border:1px solid black; padding: 0px 10px;"> Langue : {{{lang|fr}}}<br /> Statut : {{{status|stable}}} </div> [[Catégorie:{{#switch:{{lc:{{{lang|fr}}}}}|fr|en={{lc:{{{lang|fr}}}}}|#default=Langue inconnue}}]] [[Catégorie:{{#switch:{{lc:{{{status|stable}}}}}|stable=Stable|draft|brouillon=Brouillon|#default=Statut inconnu}}]] c99f3182d46f42bc39cfecce3db9e80458adf8f9 86 83 2015-02-11T16:16:30Z Seb35 1 +includeonly, +contraintes wikitext text/x-wiki <div style="top:0px; right:0px; float:right; z-index:0; background-color:white; border:1px solid black; padding: 0px 10px;"> Langue : {{#switch:{{lc:{{{lang|fr}}}}}|fr|en={{lc:{{{lang|fr}}}}}|#default=inconnue}}<br /> Statut : {{#switch:{{lc:{{{status|stable}}}}}|stable=stable|draft|brouillon=brouillon|#default=inconnu}} </div> <includeonly>[[Catégorie:{{#switch:{{lc:{{{lang|fr}}}}}|fr|en={{lc:{{{lang|fr}}}}}|#default=Langue inconnue}}]] [[Catégorie:{{#switch:{{lc:{{{status|stable}}}}}|stable=Stable|draft|brouillon=Brouillon|#default=Statut inconnu}}]]</includeonly> 74b931e6dbb079e73ba71c22d5376031210c342f Tutorial:Packaging de WebApps 102 6 77 13 2015-02-11T15:58:30Z Seb35 1 +tutorial template wikitext text/x-wiki {{Tutorial|lang=en|status=draft}} List and comparison of various webapps packaging, with the aim at finding commonalities and differencies to create a directory structure compatible with a largest set of deployment targets. (Possibly if there are uncompatible directory structures between two deployment targets, it will be up to the developer to choose what target s/he prefers.) == HTML5 == * Status: W3C Candidate Recommandation * Specification: http://www.w3.org/TR/html5/ * Package: ** Extension: ** MIME type: ** Format: ** Manifest: *.appcache * Cache manifest: ** Extension: .appcache ** MIME type: text/cache-manifest ** Format: text == Packaged Web Apps (Widgets) == * Status: W3C Recommandation * Specification: http://www.w3.org/TR/widgets/ * Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>config.xml</td><td>file</td><td>Configuration document</td></tr><tr><td>icon.png</td><td>file</td><td>Default icon</td></tr><tr><td>icon.gif</td><td>file</td><td>Default icon</td></tr><tr><td>icon.jpg</td><td>file</td><td>Default icon</td></tr><tr><td>icon.ico</td><td>file</td><td>Default icon</td></tr><tr><td>icon.svg</td><td>file</td><td>Default icon</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></tr><tr><td>index.htm</td><td>file</td><td>Default start file</td></tr><tr><td>index.svg</td><td>file</td><td>Default start file</td></tr><tr><td>index.xhtml</td><td>file</td><td>Default start file</td></tr><tr><td>index.xht</td><td>file</td><td>Default start file</td></tr><tr><td>locales</td><td>folder</td><td>Container for localized content</td></tr></table> * Package: ** Extension: .wgt ** MIME type: application/widget ** Format: ZIP file ** Manifest: config.xml (see specification) == Firefox OS / Firefox Apps == * Status: Industry specification * Documentation: https://developer.mozilla.org/en-US/Apps/Quickstart * Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>manifest.webapp</td><td>file</td><td>Manifest document</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></table> * Package: ** Format: Web hosting or ZIP file ** Manifest: manifest.webapp (see documentation) == Manifest for web apps and bookmarks == * Status: W3C Working Draft * Working draft: http://www.w3.org/TR/appmanifest/ * Package: ** Extension: N/A ** MIME type: N/A ** Format: N/A ** Manifest: * ** Manifest fetching method: &lt;link ref="manifest" href="..." /&gt; * Manifest: ** Extension: .json, .manifest ** MIME type: application/manifest+json ** Format: JSON == Opera 14- == * Status: Industry specification (deprecated) * Package: ** Extension: .oex ** Format: ZIP file == Chromium / Opera 15+ == * Status: Industry specification * Documentation Opera: https://dev.opera.com/extensions/ * Package: ** Extension: .nex ** MIME type: ** Format: ZIP file ** Manifest: manifest.json * Manifest: ** Filename: manifest.json ** Format: JSON baab107e23ff98609c1b2aaaa08a597ef66035f1 Catégorie:Fr 14 21 79 2015-02-11T16:01:12Z Seb35 1 création wikitext text/x-wiki [[Catégorie:Langue]] b891e1f2d696cddfc8b45c4992ed05a536321d5e Catégorie:Langue 14 22 80 2015-02-11T16:01:35Z Seb35 1 création wikitext text/x-wiki [[Catégorie:Racine]] 129a48f152ec5efbe3262fb58ee49b7b04112cb5 Catégorie:Racine 14 23 81 2015-02-11T16:02:05Z Seb35 1 création wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Catégorie:Stable 14 24 82 2015-02-11T16:02:45Z Seb35 1 création wikitext text/x-wiki [[Catégorie:Statut]] 822454b11ccb84c6db15f0da0be54f72777ec760 Catégorie:Statut 14 25 84 2015-02-11T16:14:31Z Seb35 1 création wikitext text/x-wiki [[Catégorie:Racine]] 129a48f152ec5efbe3262fb58ee49b7b04112cb5 Catégorie:Brouillon 14 26 85 2015-02-11T16:14:51Z Seb35 1 création wikitext text/x-wiki [[Catégorie:Statut]] 822454b11ccb84c6db15f0da0be54f72777ec760 Catégorie:En 14 27 87 2015-02-11T16:17:03Z Seb35 1 création wikitext text/x-wiki [[Catégorie:Langue]] b891e1f2d696cddfc8b45c4992ed05a536321d5e Modèle:Transféré 10 28 88 2015-02-11T16:20:00Z Seb35 1 création du modèle wikitext text/x-wiki <div align="center"><div style="background-color:#aeff00;border:2px solid #54ff00;opacity:0.8;padding:5px;display:inline-block;">Déplacé sur {{{1}}}</div></div> c9689219235260b5834084056d22e738d544ddcd Log/Seb35 0 29 94 2015-02-19T10:59:12Z Seb35 1 log en français et anglais de mon activité sur MediaWiki wikitext text/x-wiki {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}} <!-- {{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}} --> 32e6c9bfc32590200bac789ccaeb01eba5aa82ae MediaWiki:Lang 8 30 95 2015-02-19T11:16:17Z Seb35 1 lang wikitext text/x-wiki fr b858a87c07b04c4568f51b0dce655f78d73c02b3 MediaWiki:Lang/en 8 31 96 2015-02-19T11:16:33Z Seb35 1 Page créée avec « en » wikitext text/x-wiki en 094b0fe0e302854af1311afab85b5203ba457a3b Modèle:Log 10 32 97 2015-02-19T11:23:11Z Seb35 1 création wikitext text/x-wiki * {{#date:d F Y|{{{date}}}}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki/{{{page}}}?oldid={{{oldid}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|&#91;{{{site}}}&#93; [{{{site}}}{{{uri}}} {{{uri}}}]}}}} {{#ifeq|{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}} b90aa840c5d6349c03e05a918f83955d04c5a81c 98 97 2015-02-19T11:24:27Z Seb35 1 syntaxe wikitext text/x-wiki * {{#date:d F Y|{{{date}}}}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki/{{{page}}}?oldid={{{oldid}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|&#91;{{{site}}}&#93; [{{{site}}}{{{uri}}} {{{uri}}}]}}}} {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}} 055f17ea91003bc25e677ddc97b2c2e595c140bb 99 98 2015-02-19T11:30:00Z Seb35 1 syntaxe wikitext text/x-wiki * {{#date:d F Y|{{{date}}}}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}} 68888d05d2c389af87161b06696278ffa1ad3bc4 100 99 2015-02-19T11:32:31Z Seb35 1 syntaxe wikitext text/x-wiki * {{#date:d F Y|{{{date}}}}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}} {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}} 904f4dcd9b6e780423360b1e153672ba8d9300b2 Modèle:Log 10 32 101 100 2015-02-19T11:33:34Z Seb35 1 syntaxe wikitext text/x-wiki * {{#time:d F Y|{{{date}}}}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}} {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}} 8d5ef98430596ff36abf00124a41639f38d43660 102 101 2015-02-19T11:35:44Z Seb35 1 date en anglais si besoin wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}}}:|{{#time:d F Y|{{{date}}}}} :}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}} {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}} c1dbea8f7da7a3ca486575d8257f047b61d19fb0 103 102 2015-02-19T11:36:29Z Seb35 1 re wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}} {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}} 51d3a1d95c0910b5cc8cecac5208bab597d6a1b4 104 103 2015-02-19T11:40:04Z Seb35 1 +type=translation +type=translation-update wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}} {{#switch:translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition|#default={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}}} 60d37229e279f19a113d6d9e274b676ebbf15229 105 104 2015-02-19T11:40:52Z Seb35 1 syntaxe wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition|#default={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}}} 444f84b6cdd6610600d7134b0ba17e37622f018b 107 105 2015-02-19T11:51:57Z Seb35 1 +type=(sans type) pour commentaire brut wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{id:{{{site|}}}:&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|#default={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}} cdd32275c16b893e7ab319a5292984c8c55e0344 108 107 2015-02-19T11:55:44Z Seb35 1 +type=comment (=sans type) wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{id:{{{site|}}}:&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|#default={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}} b706ad537d60346ab61c44e0fc73ec7566c5c833 109 108 2015-02-19T11:57:31Z Seb35 1 syntaxe wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{if:{{{site|}}}:&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|#default={{lcfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}} 0e104df5dc894fa30c399cdb98807f882bdaa3fc 110 109 2015-02-19T11:58:39Z Seb35 1 syntaxe wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{if:{{{site|}}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|#default={{lcfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}} a6eb2c3fd2bbfe8abc4395ce46533a4ba3a283dd 111 110 2015-02-19T11:59:13Z Seb35 1 syntaxe wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{#if:{{{site|}}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|#default={{lcfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}} 50e035692c5f5c9e80e0405430cc449802e1bb2d 112 111 2015-02-19T11:59:50Z Seb35 1 typo wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{#if:{{{site|}}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}} 2eca5fd9ca33bfeb138bf2052b1997a913f9b0cc 118 112 2015-02-19T15:27:08Z Seb35 1 +type=reading, +traduction en français des types wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{#if:{{{site|}}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|reading|lecture=Lecture {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update|traduction-màj={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition|édition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}} 914c54de026dfa397072be81f5e17e4adf17605e 119 118 2015-02-19T15:35:21Z Seb35 1 +ofswiki.org wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|ofswiki.org}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|ofswiki.org=[ofswiki.org] <span class="plainlinks">[https://ofswiki.org/wiki{{localurl:{{{page}}}|{{#if:{{{oldid}}}|oldid={{{oldid}}}}}}} {{{page}}}]</span>|{{#if:{{{site|}}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|reading|lecture=Lecture {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update|traduction-màj={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition|édition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}} 204affe3b97b3311e7ac76abc2a969c1bced681c 120 119 2015-02-19T15:37:11Z Seb35 1 fix bug, rm debug wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|ofswiki.org=[ofswiki.org] <span class="plainlinks">[https://ofswiki.org/wiki{{localurl:{{{page}}}|{{#if:{{{oldid|}}}|oldid={{{oldid}}}}}}} {{{page}}}]</span>|{{#if:{{{site|}}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|reading|lecture=Lecture {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update|traduction-màj={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition|édition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}} b208e7230b561002821700124fc010b8ce9a5416 122 120 2015-02-19T15:46:23Z Seb35 1 mention du type wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|ofswiki.org=[ofswiki.org] <span class="plainlinks">[https://ofswiki.org/wiki{{localurl:{{{page}}}|{{#if:{{{oldid|}}}|oldid={{{oldid}}}}}}} {{{page}}}]</span>|{{#if:{{{site|}}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|reading|lecture=&#58;{{#ifeq:{{int:lang}}|en|read {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|lu {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction=&#58; {{#ifeq:{{int:lang}}|en|translated|traduit}}|translation-update|traduction-màj=&#58; {{#ifeq:{{int:lang}}|en|updated translation|mis à jour la traduction}}|edition|édition=&#58; {{#ifeq:{{int:lang}}|en|edited {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|modifié {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}} ff162be6e46e23b74a854b76ddb032aabd6bf453 123 122 2015-02-19T15:47:13Z Seb35 1 typo wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|ofswiki.org=[ofswiki.org] <span class="plainlinks">[https://ofswiki.org/wiki{{localurl:{{{page}}}|{{#if:{{{oldid|}}}|oldid={{{oldid}}}}}}} {{{page}}}]</span>|{{#if:{{{site|}}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|reading|lecture=&#58; {{#ifeq:{{int:lang}}|en|read {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|lu {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction=&#58; {{#ifeq:{{int:lang}}|en|translated|traduit}}|translation-update|traduction-màj=&#58; {{#ifeq:{{int:lang}}|en|updated translation|mis à jour la traduction}}|edition|édition=&#58; {{#ifeq:{{int:lang}}|en|edited {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|modifié {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}} 45a9c3817bd475d71840ca2b39857d4921a76c7d 124 123 2015-02-19T15:51:20Z Seb35 1 typo wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|ofswiki.org=[ofswiki.org] <span class="plainlinks">[https://ofswiki.org/wiki{{localurl:{{{page}}}|{{#if:{{{oldid|}}}|oldid={{{oldid}}}}}}} {{{page}}}]</span>|{{#if:{{{site|}}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}}{{#switch:{{{type|edition}}}|comment|commentaire=|#default={{#ifeq:{{int:lang}}|en|:|&#32;&#58;}}}} {{#switch:{{{type|edition}}}|reading|lecture={{#ifeq:{{int:lang}}|en|read {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|lu {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction={{#ifeq:{{int:lang}}|en|translated|traduit}}|translation-update|traduction-màj={{#ifeq:{{int:lang}}|en|updated translation|mis à jour la traduction}}|edition|édition={{#ifeq:{{int:lang}}|en|edited {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|modifié {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}} abe056767c3435ce18e830d6265fd5611ee1a92f 125 124 2015-02-19T15:52:14Z Seb35 1 syntaxe wikitext text/x-wiki * {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|ofswiki.org=[ofswiki.org] <span class="plainlinks">[https://ofswiki.org/wiki{{localurl:{{{page}}}|{{#if:{{{oldid|}}}|oldid={{{oldid}}}}}}} {{{page}}}]</span>|{{#if:{{{site|}}}|&#91;{{{site}}}&#93; [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}}{{#switch:{{{type|edition}}}|comment|commentaire=|#default={{#ifeq:{{int:lang}}|en|&#58;|&#32;&#58;}}}} {{#switch:{{{type|edition}}}|reading|lecture={{#ifeq:{{int:lang}}|en|read {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|lu {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction={{#ifeq:{{int:lang}}|en|translated|traduit}}|translation-update|traduction-màj={{#ifeq:{{int:lang}}|en|updated translation|mis à jour la traduction}}|edition|édition={{#ifeq:{{int:lang}}|en|edited {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|modifié {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}} 7e028f5013dd1324893b8bf6b18220c413b0acb5 Log/Seb35 0 29 106 94 2015-02-19T11:43:03Z Seb35 1 liste antéchronologique wikitext text/x-wiki {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}} <!-- {{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}} --> 8858ca9ca2c24638e6a4eb8349d702161d61cae0 113 106 2015-02-19T12:00:08Z Seb35 1 +1 wikitext text/x-wiki {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}} {{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}} <!-- {{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}} --> 124d834abc0d2e2df5a8a8e641c1763c6b8c5a30 114 113 2015-02-19T12:05:13Z Seb35 1 +lien pour afficher en anglais wikitext text/x-wiki <div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]</div> {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}} {{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}} <!-- {{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}} --> 59914c4c5ca9a3ef9cc628f11a61b6137540f984 116 114 2015-02-19T14:40:30Z Seb35 1 proposer d’afficher en français lorsque c’est en anglais wikitext text/x-wiki <div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">{{#ifeq:{{int:lang}}|en|[[{{PAGENAME}}|Afficher en français]]|[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]}}</div> {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}} {{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}} <!-- {{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}} --> fc946db94a1c6424f34fc839023d2f6b07c50317 117 116 2015-02-19T14:41:59Z Seb35 1 syntaxe -- la précédente, même si plus jolie, ne crée pas de lien puisque c’est la page elle-même wikitext text/x-wiki <div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">{{#ifeq:{{int:lang}}|en|[{{fullurl:{{PAGENAME}}}} Afficher en français]|[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]}}</div> {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}} {{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}} <!-- {{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}} --> e6b1a5bfd1329c4f73765066a8e68571ad8408a2 121 117 2015-02-19T15:37:41Z Seb35 1 +1 wikitext text/x-wiki <div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">{{#ifeq:{{int:lang}}|en|[{{fullurl:{{PAGENAME}}}} Afficher en français]|[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]}}</div> {{log|user=Seb35|date=2015-02-19|site=ofswiki.org|page=Mediawiki Setup Guide|type=lecture|comment-fr=guide intéressant car il couvre plusieurs facettes du travail d’administration système de MediaWiki|comment-en=interesting guide because it covers many facets around MediaWiki sysadminship}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}} {{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}} <!-- {{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}} --> 44e338d8c3a1b19fd99c9588b4db4f84f66efd47 137 121 2015-03-04T14:25:05Z Seb35 1 +1 wikitext text/x-wiki <div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">{{#ifeq:{{int:lang}}|en|[{{fullurl:{{PAGENAME}}}} Afficher en français]|[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]}}</div> {{log|user=Seb35|date=2015-03-04|site=mediawiki.org|page=Statistics about extensions|type=edition|oldid=1432378|comment-fr=publication de statistiques sur les extensions MediaWiki|comment-en=publication of statistics about MediaWiki extensions}} {{log|user=Seb35|date=2015-02-19|site=ofswiki.org|page=Mediawiki Setup Guide|type=lecture|comment-fr=guide intéressant car il couvre plusieurs facettes du travail d’administration système de MediaWiki|comment-en=interesting guide because it covers many facets around MediaWiki sysadminship}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}} {{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}} <!-- {{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}} --> 59f14c8ec204c12a2f27f5bf52b8315fbb07b6b0 151 137 2015-03-05T15:51:44Z Seb35 1 +1 wikitext text/x-wiki <div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">{{#ifeq:{{int:lang}}|en|[{{fullurl:{{PAGENAME}}}} Afficher en français]|[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]}}</div> {{log|user=Seb35|date=2015-03-05|site=mediawiki.org|page=User:Seb35/modifyToolbox|type=edition|oldid=1433375|comment-fr=publication d’un morceau de code pour modifier facilement la boîte à outils dans l’interface MediaWiki|comment-en=publication of a code snippet to easily modify the toolbox in MediaWiki interface}} {{log|user=Seb35|date=2015-03-04|site=mediawiki.org|page=Statistics about extensions|type=edition|oldid=1432378|comment-fr=publication de statistiques sur les extensions MediaWiki|comment-en=publication of statistics about MediaWiki extensions}} {{log|user=Seb35|date=2015-02-19|site=ofswiki.org|page=Mediawiki Setup Guide|type=lecture|comment-fr=guide intéressant car il couvre plusieurs facettes du travail d’administration système de MediaWiki|comment-en=interesting guide because it covers many facets around MediaWiki sysadminship}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}} {{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}} <!-- {{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}} --> d4143fa58168aa8ed3ad698212be1e8fa16b6453 200 151 2015-03-08T22:25:30Z Seb35 1 +1 wikitext text/x-wiki <div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">{{#ifeq:{{int:lang}}|en|[{{fullurl:{{PAGENAME}}}} Afficher en français]|[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]}}</div> {{log|user=Seb35|date=2015-03-08|site=mediawiki.org|page=Manual:Interface/Sidebar|type=edition|oldid=1437573|comment-fr=mention de la modification de la boîte à outil|comment-en=add a paragraph about the change of the toolbox}} {{log|user=Seb35|date=2015-03-05|site=mediawiki.org|page=User:Seb35/modifyToolbox|type=edition|oldid=1433375|comment-fr=publication d’un morceau de code pour modifier facilement la boîte à outils dans l’interface MediaWiki|comment-en=publication of a code snippet to easily modify the toolbox in MediaWiki interface}} {{log|user=Seb35|date=2015-03-04|site=mediawiki.org|page=Statistics about extensions|type=edition|oldid=1432378|comment-fr=publication de statistiques sur les extensions MediaWiki|comment-en=publication of statistics about MediaWiki extensions}} {{log|user=Seb35|date=2015-02-19|site=ofswiki.org|page=Mediawiki Setup Guide|type=lecture|comment-fr=guide intéressant car il couvre plusieurs facettes du travail d’administration système de MediaWiki|comment-en=interesting guide because it covers many facets around MediaWiki sysadminship}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}} {{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}} {{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}} {{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}} <!-- {{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}} --> f29601b95dba1496e6ead8e9dd332ec423eed9d3 Accueil 0 1 115 93 2015-02-19T12:06:47Z Seb35 1 /* Autres */ +1 wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. == Pages du wiki == === Tutoriaux === {{Special:Allpages/Tutorial:}} === Autres === * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] 41c20df7ce1271c09c93e7d89ce8bd49d95b26c0 136 115 2015-03-04T14:22:05Z Seb35 1 /* Autres */ +1 wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. == Pages du wiki == === Tutoriaux === {{Special:Allpages/Tutorial:}} === Autres === * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] be9c29e92250615226245d316ad71789d28994da MediaWiki 0 34 127 2015-03-02T15:51:56Z Seb35 1 description de MediaWiki, quelques idées d’usages wikitext text/x-wiki '''MediaWiki''' est un logiciel de wiki : il permet la gestion collaborative de connaissances, pour rassembler des communautés soit d’une certaine taille soit trop dispersées géographiquement pour se rencontrer régulièrement. <div class="plainlinks">Deux types de profils : # wiki interne au sein d’une entreprise (d’une certaine taille) : permet une mémoire collective et partagée, par exemple : #* présenter et documenter les savoir-faire métier internes, par exemple les méthodes de production, ce qui peut servir aux commerciaux pour mieux comprendre ce qui se fait et affiner leur discours ; #* partager et tenir à jour les procédures et politiques internes : processus comptables, remboursements de notes de frais, gestion des congés, intéressement des salariés, documentation sur l’informatique, etc. ; #* servir de support pour diffuser les grandes orientations de l’entreprise (stratégie, budget et plan annuels, etc.) voire les comptes-rendus de réunion ; #* possiblement stocker des documents ''s’ils peuvent être vus par tous les utilisateurs du wiki'', par exemple pour un wiki ouvert à tous les salariés certains documents ne devraient pas y être (car relevant de la vie privée, ou trop secrets pour être trop partagés, etc.) ; #* discuter autour des points précédents, par exemple sur la stratégie de l’entreprise ; cela peut bien sûr être fait autour de la machine à café dans les petites entreprises, mais ça devient moins possible dans les plus grosses entreprises. #* Exemples : [[:frwikipedia:Intellipedia|Intellipedia]] (wikis internes aux services secrets américains), [[:enwikipedia:Diplopedia|Diplopedia]] (wiki interne au Département d’État américain), [https://wiki.openstreetmap.org/ OpenStreetMap] (wiki de travail autour du projet OSM), [https://meta.wikimedia.org Meta-Wiki] (wiki de travail autour des projets Wikimedia), [http://wiki.breizh-entropy.org/ Wiki du hackerspace Breizh Entropy] (wiki de documentation et mémoire collective) # wiki communautaire autour d’un sujet donné : c’est l’usage originel des wikis sur l’Internet, pour permettre à toutes les bonnes volontés d’améliorer la connaissance autour d’un sujet ; cela peut être : #* la matière encyclopédique, par exemple [https://www.wikipedia.org/ Wikipédia] : beaucoup de sujets mais chacun ne comprend que des éléments généraux, sans rentrer trop dans le détail, #* un domaine spécialisé voire hyper-spécialisé, par exemple [http://www.ekopedia.org/ Ékopédia] (solutions écologiques), [http://starwars.wikia.com/ Wookieepedia] (univers Star Wars), [http://www.ratoupedia.org/wiki/Accueil Ratoupédia] (rats domestiques), [https://www.owasp.org/ OWASP] (sécurité informatique), une grande partie des wikis sur [http://www.wikia.com/ Wikia], #* la mémoire ou documentation d’un territoire donné, par exemple [http://www.wiki-brest.net/ Wiki-Brest], [http://www.wiki-rennes.fr/ Wiki-Rennes] #* des cours en ligne (par exemple la [https://www.wikiversity.org/ Wikiversité]) ou des savoir-faire (par exemple [https://www.wikibooks.org/ Wikibooks] ou [http://www.ekopedia.org/ Ékopédia]), #* des bases de données, par exemple [https://www.wikidata.org/ Wikidata] (base de données "encyclopédique"), [https://www.wikiquote.org/ Wikiquote] (recueil de citations), [https://www.wikidata.org/ Wikispecies] (recensement des espèces), [https://commons.wikimedia.org/ Wikimedia Commons] (médiathèque), [https://www.wiktionary.org/ Wiktionnaire] (dictionnaire). </div> 414d8003c5086119cc31206d03680eebff09c864 130 127 2015-03-02T18:35:33Z Seb35 1 +faire vivre un wiki wikitext text/x-wiki '''MediaWiki''' est un logiciel de wiki : il permet la gestion collaborative de connaissances, pour rassembler des communautés soit d’une certaine taille soit trop dispersées géographiquement pour se rencontrer régulièrement. == Types d’usages == <div class="plainlinks">Deux types de profils : # wiki interne au sein d’une entreprise (d’une certaine taille) : permet une mémoire collective et partagée, par exemple : #* présenter et documenter les savoir-faire métier internes, par exemple les méthodes de production, ce qui peut servir aux commerciaux pour mieux comprendre ce qui se fait et affiner leur discours ; #* partager et tenir à jour les procédures et politiques internes : processus comptables, remboursements de notes de frais, gestion des congés, intéressement des salariés, documentation sur l’informatique, etc. ; #* servir de support pour diffuser les grandes orientations de l’entreprise (stratégie, budget et plan annuels, etc.) voire les comptes-rendus de réunion ; #* possiblement stocker des documents ''s’ils peuvent être vus par tous les utilisateurs du wiki'', par exemple pour un wiki ouvert à tous les salariés certains documents ne devraient pas y être (car relevant de la vie privée, ou trop secrets pour être trop partagés, etc.) ; #* discuter autour des points précédents, par exemple sur la stratégie de l’entreprise ; cela peut bien sûr être fait autour de la machine à café dans les petites entreprises, mais ça devient moins possible dans les plus grosses entreprises. #* Exemples : [[:frwikipedia:Intellipedia|Intellipedia]] (wikis internes aux services secrets américains), [[:enwikipedia:Diplopedia|Diplopedia]] (wiki interne au Département d’État américain), [https://wiki.openstreetmap.org/ OpenStreetMap] (wiki de travail autour du projet OSM), [https://meta.wikimedia.org Meta-Wiki] (wiki de travail autour des projets Wikimedia), [http://wiki.breizh-entropy.org/ Wiki du hackerspace Breizh Entropy] (wiki de documentation et mémoire collective) # wiki communautaire autour d’un sujet donné : c’est l’usage originel des wikis sur l’Internet, pour permettre à toutes les bonnes volontés d’améliorer la connaissance autour d’un sujet ; cela peut être : #* la matière encyclopédique, par exemple [https://www.wikipedia.org/ Wikipédia] : beaucoup de sujets mais chacun ne comprend que des éléments généraux, sans rentrer trop dans le détail, #* un domaine spécialisé voire hyper-spécialisé, par exemple [http://www.ekopedia.org/ Ékopédia] (solutions écologiques), [http://starwars.wikia.com/ Wookieepedia] (univers Star Wars), [http://www.ratoupedia.org/wiki/Accueil Ratoupédia] (rats domestiques), [https://www.owasp.org/ OWASP] (sécurité informatique), une grande partie des wikis sur [http://www.wikia.com/ Wikia], #* la mémoire ou documentation d’un territoire donné, par exemple [http://www.wiki-brest.net/ Wiki-Brest], [http://www.wiki-rennes.fr/ Wiki-Rennes] #* des cours en ligne (par exemple la [https://www.wikiversity.org/ Wikiversité]) ou des savoir-faire (par exemple [https://www.wikibooks.org/ Wikibooks] ou [http://www.ekopedia.org/ Ékopédia]), #* des bases de données, par exemple [https://www.wikidata.org/ Wikidata] (base de données "encyclopédique"), [https://www.wikiquote.org/ Wikiquote] (recueil de citations), [https://www.wikidata.org/ Wikispecies] (recensement des espèces), [https://commons.wikimedia.org/ Wikimedia Commons] (médiathèque), [https://www.wiktionary.org/ Wiktionnaire] (dictionnaire). </div> == Faire vivre un wiki == Comme l’a analysé et expliqué [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-rôles Anthere], il est crucial pour une vie saine d’un wiki que celui-ci soit régulièrement ''jardiné'', c’est-à-dire entretenu et rangé pour rester pratique à utiliser au quotidien. Quoiqu’il est possible, dans un premier temps, qu’un unique animateur s’occupe de ce jardinage, il faut viser à court ou moyen terme que diverses personnes s’approprient l’outil et s’occupent chacune d’une facette du jardinage (cf le billet de blog précédent). ''ajouter : aspects techniques :'' * ''choisir les extensions et les installer'' * ''maintenir dans le temps les instances MediaWiki'' fbe79b1a918b4a2bc0a6f03ff30ff3eb094ea1fa 150 130 2015-03-05T14:52:56Z Seb35 1 +bénéfices d’usage wikitext text/x-wiki '''MediaWiki''' est un logiciel de wiki : il permet la gestion collaborative de connaissances, pour rassembler des communautés soit d’une certaine taille soit trop dispersées géographiquement pour se rencontrer régulièrement. == Types d’usages == <div class="plainlinks">Deux types de profils : # wiki interne au sein d’une entreprise (d’une certaine taille) : permet une mémoire collective et partagée, par exemple : #* présenter et documenter les savoir-faire métier internes, par exemple les méthodes de production, ce qui peut servir aux commerciaux pour mieux comprendre ce qui se fait et affiner leur discours ; #* partager et tenir à jour les procédures et politiques internes : processus comptables, remboursements de notes de frais, gestion des congés, intéressement des salariés, documentation sur l’informatique, etc. ; #* servir de support pour diffuser les grandes orientations de l’entreprise (stratégie, budget et plan annuels, etc.) voire les comptes-rendus de réunion ; #* possiblement stocker des documents ''s’ils peuvent être vus par tous les utilisateurs du wiki'', par exemple pour un wiki ouvert à tous les salariés certains documents ne devraient pas y être (car relevant de la vie privée, ou trop secrets pour être trop partagés, etc.) ; #* discuter autour des points précédents, par exemple sur la stratégie de l’entreprise ; cela peut bien sûr être fait autour de la machine à café dans les petites entreprises, mais ça devient moins possible dans les plus grosses entreprises. #* Exemples : [[:frwikipedia:Intellipedia|Intellipedia]] (wikis internes aux services secrets américains), [[:enwikipedia:Diplopedia|Diplopedia]] (wiki interne au Département d’État américain), [https://wiki.openstreetmap.org/ OpenStreetMap] (wiki de travail autour du projet OSM), [https://meta.wikimedia.org Meta-Wiki] (wiki de travail autour des projets Wikimedia), [http://wiki.breizh-entropy.org/ Wiki du hackerspace Breizh Entropy] (wiki de documentation et mémoire collective) # wiki communautaire autour d’un sujet donné : c’est l’usage originel des wikis sur l’Internet, pour permettre à toutes les bonnes volontés d’améliorer la connaissance autour d’un sujet ; cela peut être : #* la matière encyclopédique, par exemple [https://www.wikipedia.org/ Wikipédia] : beaucoup de sujets mais chacun ne comprend que des éléments généraux, sans rentrer trop dans le détail, #* un domaine spécialisé voire hyper-spécialisé, par exemple [http://www.ekopedia.org/ Ékopédia] (solutions écologiques), [http://starwars.wikia.com/ Wookieepedia] (univers Star Wars), [http://www.ratoupedia.org/wiki/Accueil Ratoupédia] (rats domestiques), [https://www.owasp.org/ OWASP] (sécurité informatique), une grande partie des wikis sur [http://www.wikia.com/ Wikia], #* la mémoire ou documentation d’un territoire donné, par exemple [http://www.wiki-brest.net/ Wiki-Brest], [http://www.wiki-rennes.fr/ Wiki-Rennes] #* des cours en ligne (par exemple la [https://www.wikiversity.org/ Wikiversité]) ou des savoir-faire (par exemple [https://www.wikibooks.org/ Wikibooks] ou [http://www.ekopedia.org/ Ékopédia]), #* des bases de données, par exemple [https://www.wikidata.org/ Wikidata] (base de données "encyclopédique"), [https://www.wikiquote.org/ Wikiquote] (recueil de citations), [https://www.wikidata.org/ Wikispecies] (recensement des espèces), [https://commons.wikimedia.org/ Wikimedia Commons] (médiathèque), [https://www.wiktionary.org/ Wiktionnaire] (dictionnaire). </div> == Bénéfices d’usage (en interne à une entreprise) == * Plateforme de publication de documents sur un réseau interne * Archivage et évolution des documents prévue * Travail en commun possible sur des documents (toutefois pas d’éditions concurrentes/en même temps) * Polyvalence de l’outil (quoiqu’il puisse être compliqué de faire des "contenus dynamiques" sans être formé spécifiquement) * Possibilité de discussion intégrée == Faire vivre un wiki == Comme l’a analysé et expliqué [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-rôles Anthere], il est crucial pour une vie saine d’un wiki que celui-ci soit régulièrement ''jardiné'', c’est-à-dire entretenu et rangé pour rester pratique à utiliser au quotidien. Quoiqu’il est possible, dans un premier temps, qu’un unique animateur s’occupe de ce jardinage, il faut viser à court ou moyen terme que diverses personnes s’approprient l’outil et s’occupent chacune d’une facette du jardinage (cf le billet de blog précédent). ''ajouter : aspects techniques :'' * ''choisir les extensions et les installer'' * ''maintenir dans le temps les instances MediaWiki'' 73aa0e66ef19c1a608cc3dddaa823de5b53cb4d9 MediaWiki:Sidebar 8 42 138 2015-03-04T20:06:17Z Seb35 1 test d’extension wikitext text/x-wiki * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage ** helppage|help * SEARCH * TOOLBOX ** WHATLINKSHERE|whatlinkshere ** RECENTCHANGESLINKED|recentchangeslinked-toolbox ** FEEDS ** CONTRIBUTIONS|contributions ** LOG|log ** BLOCKIP|blockip ** EMAILUSER|emailuser ** USERRIGHTS|userrights ** UPLOAD|upload ** SPECIALPAGES|specialpages ** PRINT|printableversion ** PERMALINK|permalink ** INFO|pageinfo-toolboxlink * LANGUAGES 0b2a72cdb0822ccd9a4f2cb57aaf30ac94648fec 140 138 2015-03-04T21:16:19Z Seb35 1 test wikitext text/x-wiki * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage ** helppage|help * SEARCH * TOOLBOX ** RECENTCHANGESLINKED|recentchangeslinked-toolbox ** WHATLINKSHERE|whatlinkshere ** FEEDS ** CONTRIBUTIONS|contributions ** LOG|log ** BLOCKIP|blockip ** EMAILUSER|emailuser ** USERRIGHTS|userrights ** UPLOAD|upload ** SPECIALPAGES|specialpages ** PRINT|printableversion ** PERMALINK|permalink ** INFO|pageinfo-toolboxlink * LANGUAGES caafc1a3851f66e6f609e174e320a4d4dc295b6a 141 140 2015-03-04T21:17:45Z Seb35 1 test wikitext text/x-wiki * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage ** helppage|help * SEARCH * TOOLBOX ** recentchanges-url|recentchanges ** WHATLINKSHERE|whatlinkshere ** RECENTCHANGESLINKED|recentchangeslinked-toolbox ** FEEDS ** CONTRIBUTIONS|contributions ** LOG|log ** BLOCKIP|blockip ** EMAILUSER|emailuser ** USERRIGHTS|userrights ** UPLOAD|upload ** SPECIALPAGES|specialpages ** PRINT|printableversion ** PERMALINK|permalink ** INFO|pageinfo-toolboxlink * LANGUAGES 24d3deec09dcd4bdb561688170f2fe8ebe7de39e 144 141 2015-03-05T09:47:08Z Seb35 1 test wikitext text/x-wiki * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage ** helppage|help * SEARCH * TOOLBOX ** WHATLINKSHERE|whatlinkshere ** RECENTCHANGESLINKED|recentchangeslinked-toolbox ** recentchanges-url|recentchanges ** FEEDS ** CONTRIBUTIONS|contributions ** LOG|log ** BLOCKIP|blockip ** EMAILUSER|emailuser ** USERRIGHTS|userrights ** UPLOAD|upload ** SPECIALPAGES|specialpages ** PRINT|printableversion ** PERMALINK|permalink ** INFO|pageinfo-toolboxlink * LANGUAGES 0e63cdbfc2e18611892d2e765e444e58ebdfd689 145 144 2015-03-05T09:51:04Z Seb35 1 issue wikitext text/x-wiki * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage ** helppage|help * SEARCH * TOOLBOX ** WHATLINKSHERE|whatlinkshere ** RECENTCHANGESLINKED|recentchangeslinked-toolbox ** recentchanges-url|recentchanges ** FEEDS|feeds ** CONTRIBUTIONS|contributions ** LOG|log ** BLOCKIP|blockip ** EMAILUSER|emailuser ** USERRIGHTS|userrights ** UPLOAD|upload ** SPECIALPAGES|specialpages ** PRINT|printableversion ** PERMALINK|permalink ** INFO|pageinfo-toolboxlink * LANGUAGES 233ef2f48997885ef2011c758de4316100b07e05 146 145 2015-03-05T09:57:51Z Seb35 1 test wikitext text/x-wiki * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage ** helppage|help * SEARCH * TOOLBOX ** recentchanges-url|recentchanges ** WHATLINKSHERE|whatlinkshere ** RECENTCHANGESLINKED|recentchangeslinked-toolbox ** FEEDS|feeds ** CONTRIBUTIONS|contributions ** LOG|log ** BLOCKIP|blockip ** EMAILUSER|emailuser ** USERRIGHTS|userrights ** UPLOAD|upload ** SPECIALPAGES|specialpages ** PRINT|printableversion ** PERMALINK|permalink ** INFO|pageinfo-toolboxlink * LANGUAGES 47eebd3284e5e5635fb9add66bb18860ab1d15ab 147 146 2015-03-05T11:03:20Z Seb35 1 personnalisation wikitext text/x-wiki * navigation ** mainpage|mainpage-description ** randompage-url|randompage ** helppage|help * SEARCH * TOOLBOX ** recentchanges-url|recentchanges ** WHATLINKSHERE|whatlinkshere ** RECENTCHANGESLINKED|recentchangeslinked-toolbox ** FEEDS|feeds ** CONTRIBUTIONS|contributions ** LOG|log ** BLOCKIP|blockip ** EMAILUSER|emailuser ** USERRIGHTS|userrights ** UPLOAD|upload ** SPECIALPAGES|specialpages ** PRINT|printableversion ** PERMALINK|permalink ** INFO|pageinfo-toolboxlink * LANGUAGES 961c0b82f981b1348c73effe3b24a294dc9ccaad Wiki Seb35:Copyrights 4 46 148 2015-03-05T14:43:42Z Seb35 1 basique mais important wikitext text/x-wiki Ce wiki est sous [http://www.wtfpl.net licence WTFPL 2.0]. Toutefois, même si ça n’est pas obligatoire, en cas de réutilisation, un petit mot serait le bienvenu :-) voir la section [[:seb35:contact|Contact du site]]. e04792bdda7b8c26f79ceeaa515e291d67b1b9a2 149 148 2015-03-05T14:45:28Z Seb35 1 bon, mettons CC0 pour l’instant pour éviter les dissonances avec ce qu’il y a en bas des pages wikitext text/x-wiki Ce wiki est sous [https://creativecommons.org/publicdomain/zero/1.0/ licence Creative Commons Zero (domaine public)]. Toutefois, même si ça n’est pas obligatoire, en cas de réutilisation, un petit mot serait le bienvenu :-) voir la section [[:seb35:contact|Contact du site]]. 1ef93242e61ae6aa2cd6fef668aedb701be5e0e1 Tutorial:Beautiful MediaWiki URLs 102 178 205 76 2015-03-17T12:53:30Z Seb35 1 typo wikitext text/x-wiki {{Tutorial|lang=en|status=stable}} This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit] ''instead of'' :[{{SERVER}}/index.php?title={{FULLPAGENAMEE}}&action=edit http://{{SERVERNAME}}/index.php?title={{FULLPAGENAMEE}}&action=edit] </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :[{{SERVER}}/维基百科?action=history http://{{SERVERNAME}}/维基百科?action=history] ''instead of'' :[{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history http://{{SERVERNAME}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history] </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :) == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital). # Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. 847a0f2deb11aa724d23cadf132a49f19625a162 206 205 2015-03-17T13:10:15Z Seb35 1 one more thing to consider wikitext text/x-wiki {{Tutorial|lang=en|status=stable}} This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit] ''instead of'' :[{{SERVER}}/index.php?title={{FULLPAGENAMEE}}&action=edit http://{{SERVERNAME}}/index.php?title={{FULLPAGENAMEE}}&action=edit] </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :[{{SERVER}}/维基百科?action=history http://{{SERVERNAME}}/维基百科?action=history] ''instead of'' :[{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history http://{{SERVERNAME}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history] </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :) g. An easier way to remove most of the index.php is to use [[:mw:Manual:$wgActionPaths|$wgActionPaths]]. With this configuration setting, the 'edit' action on this page would be <tt>[{{SERVER}}/edit/{{FULLPAGENAMEE}} http://{{SERVERNAME}}/edit/{{FULLPAGENAMEE}}]</tt> instead of <tt>[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit]</tt>. I have no opinion on what is better. It can be kept in mind that some browsers might remove the address part after the "?"; in these browsers, the action would or would not be displayed. Note : how does MediaWiki react with $wgActionPaths when there are (e.g.) "action=edit" and "section=0": is it "/edit/Title?section=0" or "/index.php?title=Title&action=edit&section=0"? == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital). # Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. 03570137c0bdf1de0f81eeba154fcb9ac854b005 Présentation:Wikis 104 98 208 2015-04-09T10:30:00Z Seb35 1 {{subst:ns:}} wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Présentation:Wikis/1 104 99 209 2015-04-09T10:30:40Z Seb35 1 init wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 MediaWiki:Common.css 8 4 210 34 2015-04-09T10:44:18Z Seb35 1 Espace de noms Présentation avec un style « diapositives », première itération css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104 { background: white; } .ns-104 #mw-page-base, .ns-104 #mw-head-base, .ns-104 #mw-navigation, .ns-104 #footer { display: none; } .ns-104 #content { width: 90%; margin: 2% auto; padding: 1em; border: 1px solid #A7D7F9; } e47c67b705b1a96709c6f62399bd5f0206a92018 214 210 2015-04-09T11:18:25Z Seb35 1 diapo uniquement lors de la visualisation, pas lors de l’édition ou autre css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer { display: none; } .ns-104.action-view #content { width: 90%; margin: 2% auto; padding: 1em; border: 1px solid #A7D7F9; } 154e0850969bba391dc07a76bc54668b21f7d3c6 Modèle:Présentation 10 100 211 2015-04-09T11:10:53Z Seb35 1 première version wikitext text/x-wiki <div id="presentation-bar"> <div id="arrows"> [[Fichier:Arrow Blue Left 001.svg|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}} [[Fichier:Arrow Blue Right 001.svg|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}} </div> <div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div> <div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div> </div> 3f5f489d64cc35351cf2be5c30d81a93d5e339a0 212 211 2015-04-09T11:12:55Z Seb35 1 syntaxe wikitext text/x-wiki <div id="presentation-bar"> <div id="arrows"> [[Fichier:Arrow Blue Left 001.svg|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}]] [[Fichier:Arrow Blue Right 001.svg|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}]] </div> <div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div> <div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div> </div> 20be2392f94d849b74a1f0123872936e98e44727 213 212 2015-04-09T11:13:28Z Seb35 1 syntaxe wikitext text/x-wiki <div id="presentation-bar"> <div id="arrows"> [[Fichier:Arrow Blue Left 001.svg|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}]] [[Fichier:Arrow Blue Right 001.svg|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}]] </div> <div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div> <div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div> </div> 320c226ce3ae10c9ed80fb658ca5de042f0ce449 Modèle:Présentation 10 100 215 213 2015-04-09T11:21:42Z Seb35 1 taille icônes wikitext text/x-wiki <div id="presentation-bar"> <div id="arrows"> [[Fichier:Arrow Blue Left 001.svg|25px<includeonly>|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}</includeonly>]] [[Fichier:Arrow Blue Right 001.svg|25px<includeonly>|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}</includeonly>]] </div> <div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div> <div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div> </div> 5a582580293f262f3b776622dfb97c848c910184 216 215 2015-04-09T12:05:49Z Seb35 1 plus de logique pour ne pas afficher des liens inexistants wikitext text/x-wiki <div id="presentation-bar"> <div id="arrows"> [[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexists:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]] [[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexists:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]] </div> <div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div> <div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div> </div> f8aa4f4fd09b6332a7d2cc8b1cb96a87d75f5411 217 216 2015-04-09T12:08:52Z Seb35 1 syntaxe wikitext text/x-wiki <div id="presentation-bar"> <div id="arrows"> [[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]] [[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]] </div> <div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div> <div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div> </div> dd1182dab0c615523534ccbcaaebff72a8c2302b 219 217 2015-04-09T12:15:04Z Seb35 1 ne pas afficher les flèches si on est au début ou à la fin wikitext text/x-wiki <div id="presentation-bar"> <div id="arrows"> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span> </div> <div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div> <div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div> </div> a7c8887dcf83da3c2123a757acf635166d7d5dcd 222 219 2015-04-09T12:17:54Z Seb35 1 debug wikitext text/x-wiki <div id="presentation-bar"> <div id="arrows"> <div style="">[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</div> <div style="">[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</div> </div> <div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div> <div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div> </div> 9ca31908590f9fea33f81cbd9f813df66610a17c 223 222 2015-04-09T12:26:39Z Seb35 1 bien sûr… wikitext text/x-wiki <div id="presentation-bar"> <div id="arrows"> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span> </div> <div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div> <div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div> </div> fa0d4a8f6301be05cc2d4a2aae4aabf58ab71e1a 224 223 2015-04-09T13:08:47Z Seb35 1 wikitext text/x-wiki <div id="presentation-bar"> <div id="presentation-bar-edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div> <div id="presentation-bar-arrows"> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span> </div> <div id="presentation-bar-counter">{{SUBPAGENAME}}/{{{total|10}}}</div> </div> ec4a5f3352dc29d40247a10ce747a2d593fa62cc 225 224 2015-04-09T13:22:33Z Seb35 1 mise en page wikitext text/x-wiki <div id="presentation-bar"> <div id="presentation-bar-edit" class="plainlinks" style="float: left;">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div> <div id="presentation-bar-right" style="float: right;"> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span> {{SUBPAGENAME}}/{{{total|10}}} </div> </div> 7b6bc4628278ce734e212f3fa55d06cb33d1e600 226 225 2015-04-09T13:24:39Z Seb35 1 mise en page wikitext text/x-wiki <div id="presentation-bar"> <p class="plainlinks" style="float: left;">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</p> <p style="float: right;"> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span> {{SUBPAGENAME}}/{{{total|10}}} </p> </div> e8eb10db73e71cffb18321eb8c986030180114d8 232 226 2015-04-09T14:23:23Z Seb35 1 séparation en deux parties gauche et droit wikitext text/x-wiki <div id="presentation-bar-left" class="presentation-base plainlinks"> <p>[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}] [[{{NAMESPACE}}:{{BASEPAGENAME}}|{{BASEPAGENAME}}]]</p> </div> <div id="presentation-bar-right" class="presentation-base"> <p> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|20px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|20px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span> {{SUBPAGENAME}}/{{{total|10}}} </p> </div> e851b51a4f5ccc0ed148bf6217ffd70f8536e821 235 232 2015-04-09T14:35:03Z Seb35 1 inversion liens titre et modifier wikitext text/x-wiki <div id="presentation-bar-left" class="presentation-bar plainlinks"> <p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|{{BASEPAGENAME}}]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} {{lc:{{int:edit}}}}]</p> </div> <div id="presentation-bar-right" class="presentation-base"> <p> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|18px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|18px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span> {{SUBPAGENAME}}/{{{total|10}}} </p> </div> f8f0a1885009f39fc75e41d777ffaee4de5d9e91 236 235 2015-04-09T14:38:46Z Seb35 1 couleur lien wikitext text/x-wiki <div id="presentation-bar-left" class="presentation-bar plainlinks"> <p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|{{BASEPAGENAME}}]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0B0080;">{{lc:{{int:edit}}}}]</span></p> </div> <div id="presentation-bar-right" class="presentation-base"> <p> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|18px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|18px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span> {{SUBPAGENAME}}/{{{total|10}}} </p> </div> 65f145a7cb0d01d64b2c011605be5208bedcc7ca 237 236 2015-04-09T14:40:04Z Seb35 1 couleur lien wikitext text/x-wiki <div id="presentation-bar-left" class="presentation-bar plainlinks"> <p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|{{BASEPAGENAME}}]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}]</span></p> </div> <div id="presentation-bar-right" class="presentation-base"> <p> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|18px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|18px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span> {{SUBPAGENAME}}/{{{total|10}}} </p> </div> 92d1d150174314ce3927d9a97757314a5d0eef2a 238 237 2015-04-09T14:47:37Z Seb35 1 tailles wikitext text/x-wiki <div id="presentation-bar-left" class="presentation-bar plainlinks"> <p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|{{BASEPAGENAME}}]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}]</span></p> </div> <div id="presentation-bar-right" class="presentation-bar"> <p> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span> {{SUBPAGENAME}}/{{{total|10}}} </p> </div> aea38035f2d23bad9e4e235ad98ef8bb38d664e0 242 238 2015-04-09T19:44:48Z Seb35 1 couleur wikitext text/x-wiki <div id="presentation-bar-left" class="presentation-bar plainlinks"> <p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|<span style="color:#0645AD;">{{BASEPAGENAME}}</span>]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}]</span></p> </div> <div id="presentation-bar-right" class="presentation-bar"> <p> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span> {{SUBPAGENAME}}/{{{total|10}}} </p> </div> 66634a4ae55e44045cf82a82101f63b07030458d 249 242 2015-04-09T21:37:48Z Seb35 1 +displaytitle, +exemple de gestion des sous-pages pour la fonction "Suivant" wikitext text/x-wiki <div id="presentation-bar-left" class="presentation-bar plainlinks"> <p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|<span style="color:#0645AD;">{{BASEPAGENAME}}</span>]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}]</span></p> </div> <div id="presentation-bar-right" class="presentation-bar"> <p> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span> <span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span> {{SUBPAGENAME}}/{{{total|10}}} </p> </div> {{#if:{{{1|}}}|{{DISPLAYTITLE:{{{1}}}}}}}<!-- Lorqu’on est dans une sous-page (e.g. Présentation:Foo/2/3), rechercher la page suivante entre : - Présentation:Foo/2/4 - Présentation:Foo/3 - Présentation:Foo/3/0 - Présentation:Foo/3/1 [[Fichier:Arrow Blue Right 001.svg|15px|link={{#ifeq:{{BASEPAGENAME}}|{{ROOTPAGENAME}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{#ifexist:{{#titleparts:{{FULLPAGENAME}}|-2}}/{{#expr:{{#titleparts:{{FULLPAGENAME}}|-1|-2}}+1}}|{{#titleparts:{{FULLPAGENAME}}|-2}}/{{#expr:{{#titleparts:{{FULLPAGENAME}}|-1|-2}}+1}}|{{#ifexist:{{#titleparts:{{FULLPAGENAME}}|-2}}/{{#expr:{{#titleparts:{{FULLPAGENAME}}|-1|-2}}+1}}/0|{{#titleparts:{{FULLPAGENAME}}|-2}}/{{#expr:{{#titleparts:{{FULLPAGENAME}}|-1|-2}}+1}}/0|{{#ifexist:{{#titleparts:{{FULLPAGENAME}}|-2}}/{{#expr:{{#titleparts:{{FULLPAGENAME}}|-1|-2}}+1}}/1|{{#titleparts:{{FULLPAGENAME}}|-2}}/{{#expr:{{#titleparts:{{FULLPAGENAME}}|-1|-2}}+1}}/1}}}}}}}}}}]] Ce raisonnement n’est pas possible pour la fonction "Prédédent" car on ne sait pas combien il y avait de diapos dans la section précédent. --> 6776e9965e689b29f0d66123bc52a5e6dc58f6fb Présentation:Wikis/1 104 99 218 209 2015-04-09T12:09:10Z Seb35 1 wikitext text/x-wiki {{Présentation}} c72c7716fa99f66d2e9e15d3594b2529de6625b2 227 218 2015-04-09T13:40:04Z Seb35 1 wikitext text/x-wiki Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. Curabitur aliquet pellentesque diam. Integer quis metus vitae elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, et tristique ligula justo vitae magna. Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet. {{DISPLAYTITLE:Définition d’un wiki}} {{Présentation}} 5d119be37bb45e5ca077e43dc51566017b9093f3 Présentation:Wikis/1/1 104 101 220 2015-04-09T12:15:26Z Seb35 1 init wikitext text/x-wiki {{Presentation}} 1f488ee887a86db329e5995c5eae0fd6663d4e24 221 220 2015-04-09T12:15:47Z Seb35 1 init wikitext text/x-wiki {{Présentation}} c72c7716fa99f66d2e9e15d3594b2529de6625b2 240 221 2015-04-09T15:09:45Z Seb35 1 init wikitext text/x-wiki <span style="color:#9B85BE;">WIKI</span> [[Fichier:Tamponsmots wiki.jpg|left]] <span style="color:#9B85BE;">DÉFINITION(S)</span> Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite » Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki. <span style="color:#9B85BE;">ORIGINE</span> Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003 <span style="color:#9B85BE;">CITATIONS FRANÇAISES</span> « Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. » Jérôme Delacroix, ''Les Wikis'' {{Présentation}} 20dcbfd0038cd17b20d7834f6ca1799345bdc9f4 241 240 2015-04-09T19:42:45Z Seb35 1 +concours Dis-moi dix mots wikitext text/x-wiki <div class="plainlinks" style="width:70%; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;"> <span style="color:#9B85BE;">'''WIKI'''</span> <div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div> <span style="color:#9B85BE;">DÉFINITION(S)</span><br /> Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite » Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki. <span style="color:#9B85BE;">ORIGINE</span><br /> Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003 <span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br /> « Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. » Jérôme Delacroix, ''Les Wikis'' </div> Le mot « wiki » est un des mots à utiliser dans le concours de poésie ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015. </div> {{Présentation}} a9a5dd7e63154c4db85cdcdf7980a522cf12069f 243 241 2015-04-09T19:44:54Z Seb35 1 mise en page wikitext text/x-wiki <div class="plainlinks" style="width:70%; margin-top:1em; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;"> <span style="color:#9B85BE;">'''WIKI'''</span> <div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div> <span style="color:#9B85BE;">DÉFINITION(S)</span><br /> Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite » Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki. <span style="color:#9B85BE;">ORIGINE</span><br /> Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003 <span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br /> « Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. » Jérôme Delacroix, ''Les Wikis'' </div> Le mot « wiki » est un des mots à utiliser dans le concours de poésie ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015. </div> {{Présentation}} 5ceb1dc03f1fd8df3c4acd9ca004cad241ac3d30 244 243 2015-04-09T19:47:36Z Seb35 1 wikitext text/x-wiki <div class="plainlinks" style="width:70%; margin-top:2.5em; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;"> <span style="color:#9B85BE;">'''WIKI'''</span> <div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div> <span style="color:#9B85BE;">DÉFINITION(S)</span><br /> Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite » Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki. <span style="color:#9B85BE;">ORIGINE</span><br /> Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003 <span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br /> « Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. » Jérôme Delacroix, ''Les Wikis'' </div> Le mot « wiki » est un des mots à utiliser dans le concours de poésie ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015. </div> {{Présentation}} 872a5f25ffef31ed5d66822d6c10e9e4f1fbc151 245 244 2015-04-09T19:50:37Z Seb35 1 +titre wikitext text/x-wiki <div class="plainlinks" style="width:70%; margin-top:3.5em; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;"> <span style="color:#9B85BE;">'''WIKI'''</span> <div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div> <span style="color:#9B85BE;">DÉFINITION(S)</span><br /> Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite » Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki. <span style="color:#9B85BE;">ORIGINE</span><br /> Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003 <span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br /> « Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. » Jérôme Delacroix, ''Les Wikis'' </div> Le mot « wiki » est un des mots à utiliser dans le concours de poésie ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015. </div> {{DISPLAYTITLE:Définition d’un wiki}} {{Présentation}} d0cf87171f6bafadf9b1dd31a396bbaa9d010c9a 247 245 2015-04-09T21:05:10Z Seb35 1 wikitext text/x-wiki <div class="plainlinks" style="width:70%; margin-top:4.5em; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;"> <span style="color:#9B85BE;">'''WIKI'''</span> <div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div> <span style="color:#9B85BE;">DÉFINITION(S)</span><br /> Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite » Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki. <span style="color:#9B85BE;">ORIGINE</span><br /> Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003 <span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br /> « Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. » Jérôme Delacroix, ''Les Wikis'' </div> Le mot « wiki » est un des mots à utiliser dans le concours de poésie et d’art ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015. </div> {{DISPLAYTITLE:Définition d’un wiki}} {{Présentation}} 1b67709b4a680e164d92413d285b06393aee795b 248 247 2015-04-09T21:11:39Z Seb35 1 syntaxe wikitext text/x-wiki <div class="plainlinks" style="width:70%; margin-top:4.5em; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;"> <span style="color:#9B85BE;">'''WIKI'''</span> <div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div> <span style="color:#9B85BE;">DÉFINITION(S)</span><br /> Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite » Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki. <span style="color:#9B85BE;">ORIGINE</span><br /> Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003 <span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br /> « Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. » Jérôme Delacroix, ''Les Wikis'' </div> Le mot « wiki » est un des mots à utiliser dans le concours de poésie et d’art ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015. </div> {{Présentation|Définition d’un wiki}} 2a1bdc0f52203f7f2a84c76e8393ce3bbdc47ad4 MediaWiki:Common.css 8 4 228 214 2015-04-09T13:59:28Z Seb35 1 gestion de la hauteur des diapos css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 97%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer { display: none; } .ns-104.action-view #content { width: 90%; height: 92%; margin: 2% auto; padding: 1em; border: 1px solid #A7D7F9; } a83c06d4f31659cdad394a8c66f17e02c89da538 229 228 2015-04-09T14:10:37Z Seb35 1 hauteur diapo css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 96%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } 5a672526883f30bba572f554f77084d513e5ab87 230 229 2015-04-09T14:11:29Z Seb35 1 re css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } c08de50cb1f20a1dfc2d03064bcec9d7d5798c43 231 230 2015-04-09T14:12:50Z Seb35 1 re css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 96%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } 5a672526883f30bba572f554f77084d513e5ab87 233 231 2015-04-09T14:25:53Z Seb35 1 position de la barre de présentation css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 96%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104 .presentation-bar { font-size: 85%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 2%; } .ns-104 #presentation-bar-left { left: 8% } .ns-104 #presentation-bar-right { right: 8%; } 14c25f4e0e84e906d195a154c36fee68572dbdf6 234 233 2015-04-09T14:32:40Z Seb35 1 ajustement barre de navigation css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 96%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 2%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } b9acdef5d0b7fa176f81b7d495938979ff93d8b0 246 234 2015-04-09T19:56:40Z Seb35 1 retrait de la ligne de titre dans les présentations css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 96%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 2%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } 50ae93b7743c53345ebf4f22731d1bf6dfda2949 Fichier:Tamponsmots wiki.jpg 6 102 239 2015-04-09T15:00:52Z Seb35 1 ©Polysémique Extrait de http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots pour illustration du mot choisi "wiki". wikitext text/x-wiki ©Polysémique Extrait de http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots pour illustration du mot choisi "wiki". e05480d9c747fe460e88c3347c893ccb20d5716a Module:Présentation 0 103 250 2015-04-10T09:54:17Z Seb35 1 création du code de base, je commenterai bientôt :-) wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i en end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] en end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] en end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( title.subpageText+1 ).exists then title = title.basePageTitle.subPageTitle( title.subpageText+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end f6446565dfde78fb896e5091e43da4cbc0e96ccb Module:Présentation 828 104 251 2015-04-10T10:55:10Z 81.53.206.206 0 création du code de base, je commenterai bientôt :-) wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( title.subpageText+1 ).exists then title = title.basePageTitle.subPageTitle( title.subpageText+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end 6a3880452c3ae65543575cc464f468c1eeab8a47 252 251 2015-04-10T14:59:47Z Seb35 1 return wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( title.subpageText+1 ).exists then title = title.basePageTitle.subPageTitle( title.subpageText+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end return presentation dd18731bf13203392e0ed7a742d2b40ab2cdfdd4 253 252 2015-04-10T15:02:22Z Seb35 1 fix bug wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end return presentation 0d8d0670c6f114f0890ab0fe1d1237d7cc19a8ba 254 253 2015-04-10T15:07:55Z Seb35 1 test wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end function presention.test( frame ) return mw.title.getCurrentTitle().fullText end function presention.test2( frame ) return mw.title.getCurrentTitle().rootText end function presention.test3( frame ) return mw.title.getCurrentTitle().subpageText end function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end return presentation 0ee0cc66ee3440dc2f37ebcd887efbb89fac45b0 255 254 2015-04-10T15:09:52Z Seb35 1 wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end --[[function presention.test( frame ) return mw.title.getCurrentTitle().fullText end function presention.test2( frame ) return mw.title.getCurrentTitle().rootText end function presention.test3( frame ) return mw.title.getCurrentTitle().subpageText end]] function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end return presentation 72443b6e1241c033823248715e4c40e847cc80c1 256 255 2015-04-10T15:11:45Z Seb35 1 wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end function presention.test( frame ) return mw.title.getCurrentTitle() end --[[function presention.test2( frame ) return mw.title.getCurrentTitle().rootText end function presention.test3( frame ) return mw.title.getCurrentTitle().subpageText end]] function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end return presentation 2587d78f803a3ccf5f6f4be398430b9e41adaa99 257 256 2015-04-10T15:13:34Z Seb35 1 wikitext text/x-wiki --[[ ]] local presentation = {} --[[function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end]] function presention.test( frame ) return mw.title.getCurrentTitle() end --[[function presention.test2( frame ) return mw.title.getCurrentTitle().rootText end function presention.test3( frame ) return mw.title.getCurrentTitle().subpageText end]] function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end return presentation 2e8035451fe3f6a5741eec14e0cf51cde83d9df5 258 257 2015-04-10T15:15:31Z Seb35 1 wikitext text/x-wiki --[[ ]] local presentation = {} --[[function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end]] function presention.test( frame ) return mw.title.getCurrentTitle() end --[[function presention.test2( frame ) return mw.title.getCurrentTitle().rootText end function presention.test3( frame ) return mw.title.getCurrentTitle().subpageText end function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end]] return presentation dea07c73086f9e841fdaed48893e0fd5a94549ec 259 258 2015-04-10T15:16:45Z Seb35 1 wikitext text/x-wiki --[[ ]] local presentation = {} --[[function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end]] function presentation.test( frame ) return mw.title.getCurrentTitle() end function presentation.test2( frame ) return mw.title.getCurrentTitle().rootText end function presentation.test3( frame ) return mw.title.getCurrentTitle().subpageText end --[[function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end]] return presentation bf2989d1e15cd728bbc93073a6ad92dc99a453ce 260 259 2015-04-10T15:19:02Z Seb35 1 test wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end function presentation.test( frame ) return tonumber(mw.title.getCurrentTitle().subpageText) end function presentation.test2( frame ) return tonumber(mw.title.getCurrentTitle().subpageText)+1 end function presentation.test3( frame ) return title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) end function presentation.test4( frame ) return title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists end function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end return presentation d1564c237aed501a5aaa39b11e4e5a28fce975c2 261 260 2015-04-10T15:20:22Z Seb35 1 wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end function presentation.test( frame ) return tonumber(mw.title.getCurrentTitle().subpageText) end function presentation.test2( frame ) return tonumber(mw.title.getCurrentTitle().subpageText)+1 end function presentation.test3( frame ) return mw.title.getCurrentTitle().basePageTitle.subPageTitle( tonumber(mw.title.getCurrentTitle().subpageText)+1 ) end function presentation.test4( frame ) return mw.title.getCurrentTitle().basePageTitle.subPageTitle( tonumber(mw.title.getCurrentTitle().subpageText)+1 ).exists end function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end return presentation 90a4539f5eebca2cf779e32b2b2243c9c1414ac7 262 261 2015-04-10T15:22:45Z Seb35 1 wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end function presentation.test( frame ) return tonumber(mw.title.getCurrentTitle().subpageText) end function presentation.test2( frame ) return tonumber(mw.title.getCurrentTitle().subpageText)+1 end function presentation.test3( frame ) return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tonumber(mw.title.getCurrentTitle().subpageText)+1 ) end function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end return presentation 96d5111aa52087263a15dd38206f9eb5e71d9c04 263 262 2015-04-10T15:24:34Z Seb35 1 wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end function presentation.test( frame ) return tonumber(mw.title.getCurrentTitle().subpageText) end function presentation.test2( frame ) return tonumber(mw.title.getCurrentTitle().subpageText)+1 end function presentation.test3( frame ) return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) ) end function presentation.test4( frame ) return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) ).exists end function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end return presentation 4ec9f4a735079490814c43759497003607591c3b 264 263 2015-04-10T15:26:02Z Seb35 1 wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end function presentation.test( frame ) return tonumber(mw.title.getCurrentTitle().subpageText) end function presentation.test2( frame ) return tonumber(mw.title.getCurrentTitle().subpageText)+1 end function presentation.test3( frame ) return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) ) end function presentation.test4( frame ) return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) ).exists end function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; local title = title.rootPageTitle; while true do if title.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle:subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle:subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then title = title.basePageTitle.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 .. '/0' ) list[table.getn(list)] = title.fullText elseif title.basePageTitle.basePagTitle:subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then title = title.basePageTitle.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 .. '/1' ) list[table.getn(list)] = title.fullText else break end end return list end return presentation 958bf4f29d8251976968c523516b1e846fcda859 Module:Présentation 828 104 265 264 2015-04-10T16:40:14Z Seb35 1 debug et testé en ligne de commande, ça devrait fonctionner wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end function presentation.test( frame ) return tonumber(mw.title.getCurrentTitle().subpageText) end function presentation.test2( frame ) return tonumber(mw.title.getCurrentTitle().subpageText)+1 end function presentation.test3( frame ) return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) ) end function presentation.test4( frame ) return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) ).exists end function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; title = title.rootPageTitle; while true do if title:subPageTitle( '0' ).exists then title = title:subPageTitle( '0' ) list[table.getn(list)+1] = title.fullText elseif title:subPageTitle( '1' ).exists then title = title:subPageTitle( '1' ) list[table.getn(list)+1] = title.fullText elseif title.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 ).exists then title = title.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 ) list[table.getn(list)+1] = title.fullText elseif title.baseText ~= title.rootText then title = title.basePageTitle else break end end return list end return presentation 3c118fc309e945ec3193ebdba6949bce086e4749 266 265 2015-04-10T16:42:32Z Seb35 1 wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) ) end function presentation.test( frame ) return tonumber(mw.title.getCurrentTitle().subpageText) end function presentation.test2( frame ) return tonumber(mw.title.getCurrentTitle().subpageText)+1 end function presentation.test3( frame ) return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) ) end function presentation.test4( frame ) return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) ).exists end function presentation.current( frame ) for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; title = title.rootPageTitle; while true do if title:subPageTitle( '0' ).exists then title = title:subPageTitle( '0' ) list[table.getn(list)+1] = title.fullText elseif title:subPageTitle( '1' ).exists then title = title:subPageTitle( '1' ) list[table.getn(list)+1] = title.fullText elseif title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ).exists then title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ) list[table.getn(list)+1] = title.fullText elseif title.baseText ~= title.rootText then title = title.basePageTitle else break end end return list end return presentation 5d180801295b3d12695e502ddef728125be5038f 268 266 2015-04-10T16:56:32Z Seb35 1 retrait des tests wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) return table.getn( sequence ) end function presentation.current( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; title = title.rootPageTitle; while true do if title:subPageTitle( '0' ).exists then title = title:subPageTitle( '0' ) list[table.getn(list)+1] = title.fullText elseif title:subPageTitle( '1' ).exists then title = title:subPageTitle( '1' ) list[table.getn(list)+1] = title.fullText elseif title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ).exists then title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ) list[table.getn(list)+1] = title.fullText elseif title.baseText ~= title.rootText then title = title.basePageTitle else break end end return list end return presentation 10dea3a3fc90cc8aa24841f9a768bd52b9ff95a3 269 268 2015-04-10T16:59:46Z Seb35 1 vérification supplémentaire wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) return table.getn( sequence ) end function presentation.current( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return i end end end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end end function presentation._expandSequence( title ) local list = {}; title = title.rootPageTitle; while true do if title:subPageTitle( '0' ).exists then title = title:subPageTitle( '0' ) list[table.getn(list)+1] = title.fullText elseif title:subPageTitle( '1' ).exists then title = title:subPageTitle( '1' ) list[table.getn(list)+1] = title.fullText elseif tonumber(title.subpageText) ~= nil and title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ).exists then title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ) list[table.getn(list)+1] = title.fullText elseif title.baseText ~= title.rootText then title = title.basePageTitle else break end end return list end return presentation c457c5db21de35af57c8ad937693d1d7cc634594 270 269 2015-04-10T17:02:48Z Seb35 1 valeurs de retour par défaut wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) return table.getn( sequence ) end function presentation.current( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return i end end return 0 end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end return '' end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end return '' end function presentation._expandSequence( title ) local list = {}; title = title.rootPageTitle; while true do if title:subPageTitle( '0' ).exists then title = title:subPageTitle( '0' ) list[table.getn(list)+1] = title.fullText elseif title:subPageTitle( '1' ).exists then title = title:subPageTitle( '1' ) list[table.getn(list)+1] = title.fullText elseif tonumber(title.subpageText) ~= nil and title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ).exists then title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ) list[table.getn(list)+1] = title.fullText elseif title.baseText ~= title.rootText then title = title.basePageTitle else break end end return list end return presentation 3c86a9ba8ebd6633ae35891353c5fcaa63e21e6d 273 270 2015-04-10T17:43:47Z Seb35 1 bug résolu (normalement) : récursion infinie lorsque des pages hiérarchiques sont utilisées wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) return table.getn( sequence ) end function presentation.current( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return i end end return 0 end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end return '' end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end return '' end function presentation._expandSequence( title ) local list = {}; title = title.rootPageTitle; while true do if title:subPageTitle( '0' ).exists then title = title:subPageTitle( '0' ) list[table.getn(list)+1] = title.fullText elseif title:subPageTitle( '1' ).exists then title = title:subPageTitle( '1' ) list[table.getn(list)+1] = title.fullText elseif tonumber(title.subpageText) ~= nil and title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ).exists then title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ) list[table.getn(list)+1] = title.fullText elseif title.baseText ~= title.rootText then title = title.basePageTitle.basePageTitle:subpageTitle( tostring(tonumber(title.basePageTitle.subpageText)+1) ) if title.exists then list[table.getn(list)+1] = title.fullText end else break end end return list end return presentation 56fbdf61db6c8a7c968a87e3f1daae21bec9e9b3 274 273 2015-04-10T17:45:45Z Seb35 1 typo wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) return table.getn( sequence ) end function presentation.current( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return i end end return 0 end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end return '' end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end return '' end function presentation._expandSequence( title ) local list = {}; title = title.rootPageTitle; while true do if title:subPageTitle( '0' ).exists then title = title:subPageTitle( '0' ) list[table.getn(list)+1] = title.fullText elseif title:subPageTitle( '1' ).exists then title = title:subPageTitle( '1' ) list[table.getn(list)+1] = title.fullText elseif tonumber(title.subpageText) ~= nil and title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ).exists then title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ) list[table.getn(list)+1] = title.fullText elseif title.baseText ~= title.rootText then title = title.basePageTitle.basePageTitle:subPageTitle( tostring(tonumber(title.basePageTitle.subpageText)+1) ) if title.exists then list[table.getn(list)+1] = title.fullText end else break end end return list end return presentation e542933bb916c7be2bddbeba357d130a70b50b54 280 274 2015-04-12T20:43:23Z Seb35 1 ajout de la possibilité du scénario /1/2, /1/3/1, … wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) return table.getn( sequence ) end function presentation.current( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return i end end return 0 end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end return '' end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end return '' end function presentation._expandSequence( title ) local list = {}; title = title.rootPageTitle; while true do if title:subPageTitle( '0' ).exists then title = title:subPageTitle( '0' ) list[table.getn(list)+1] = title.fullText elseif title:subPageTitle( '1' ).exists then title = title:subPageTitle( '1' ) list[table.getn(list)+1] = title.fullText elseif tonumber(title.subpageText) ~= nil then if not title.exists then if title.baseText == title.rootText then break end title = title.basePageTitle.basePageTitle:subPageTitle( tostring(tonumber(title.basePageTitle.subpageText)+1) ) else title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ) if title.exists then list[table.getn(list)+1] = title.fullText end end else break end end return list end return presentation e8e923f3c3825ceae720d1941beee52363834a23 Modèle:Présentation 10 100 267 249 2015-04-10T16:50:58Z Seb35 1 utilisation de Lua pour gérer les diapos précédentes et suivantes, pour pouvoir utiliser un ordre hiérarchique des diapos : /1, /1/1, /1/2, /2, /2/0, /2/1, /2/2, /2/3 wikitext text/x-wiki <div id="presentation-bar-left" class="presentation-bar plainlinks"> <p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|<span style="color:#0645AD;">{{BASEPAGENAME}}</span>]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}]</span></p> </div> <div id="presentation-bar-right" class="presentation-bar"> <p> <span style="{{#if:{{#invoke:Présentation|previous}}||visibility:hidden;}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#invoke:Présentation|previous}}]]</span> <span style="{{#if:{{#invoke:Présentation|next}}||visibility:hidden;}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#invoke:Présentation|next}}]]</span> {{#invoke:Présentation|current}}/{{#invoke:Présentation|total}} </p> </div> {{#if:{{{1|}}}|{{DISPLAYTITLE:{{{1}}}}}}} b0a6da79bfe22ff36bc4bc96e61f4936560635f6 275 267 2015-04-10T17:47:27Z Seb35 1 fix nom de la présentation lorsqu’il y a plus d’un niveau wikitext text/x-wiki <div id="presentation-bar-left" class="presentation-bar plainlinks"> <p>[[{{NAMESPACE}}:{{ROOTPAGENAME}}|<span style="color:#0645AD;">{{ROOTPAGENAME}}</span>]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}]</span></p> </div> <div id="presentation-bar-right" class="presentation-bar"> <p> <span style="{{#if:{{#invoke:Présentation|previous}}||visibility:hidden;}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#invoke:Présentation|previous}}]]</span> <span style="{{#if:{{#invoke:Présentation|next}}||visibility:hidden;}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#invoke:Présentation|next}}]]</span> {{#invoke:Présentation|current}}/{{#invoke:Présentation|total}} </p> </div> {{#if:{{{1|}}}|{{DISPLAYTITLE:{{{1}}}}}}} 3d43588a7eb91c9dea49024de08c67157c86a3e0 287 275 2015-04-12T21:13:12Z Seb35 1 +2 liens, +classes wikitext text/x-wiki <div id="presentation-bar-left" class="presentation-bar plainlinks"> <p>[[{{NAMESPACE}}:{{ROOTPAGENAME}}|<span style="color:#0645AD;">{{ROOTPAGENAME}}</span>]]<!-- --><span class="presentation-edit">&nbsp;– [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}</span>]</span><!-- --><span class="presentation-purge">&nbsp;– [{{fullurl:{{FULLPAGENAME}}|action=purge}} <span style="color:#0645AD;">{{lc:{{int:purge}}}}</span>]</span><!-- --><span class="presentation-move">&nbsp;– [[{{#special:Movepage}}/{{FULLPAGENAME}}|<span style="color:#0645AD;">{{lc:{{int:move}}}}</span>]</span></p> </div> <div id="presentation-bar-right" class="presentation-bar"> <p> <span style="{{#if:{{#invoke:Présentation|previous}}||visibility:hidden;}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#invoke:Présentation|previous}}]]</span> <span style="{{#if:{{#invoke:Présentation|next}}||visibility:hidden;}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#invoke:Présentation|next}}]]</span> {{#invoke:Présentation|current}}/{{#invoke:Présentation|total}} </p> </div> {{#if:{{{1|}}}|{{DISPLAYTITLE:{{{1}}}}}}} b9e3e4756cf097facbcd36ee275f6a44eb6768a8 288 287 2015-04-12T21:14:37Z Seb35 1 syntaxe wikitext text/x-wiki <div id="presentation-bar-left" class="presentation-bar plainlinks"> <p>[[{{NAMESPACE}}:{{ROOTPAGENAME}}|<span style="color:#0645AD;">{{ROOTPAGENAME}}</span>]]<!-- --><span class="presentation-edit">&nbsp;– [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}</span>]</span><!-- --><span class="presentation-purge">&nbsp;– [{{fullurl:{{FULLPAGENAME}}|action=purge}} <span style="color:#0645AD;">{{lc:{{int:purge}}}}</span>]</span><!-- --><span class="presentation-move">&nbsp;– [[{{#special:Movepage}}/{{FULLPAGENAME}}|<span style="color:#0645AD;">{{lc:{{int:move}}}}</span>]]</span></p> </div> <div id="presentation-bar-right" class="presentation-bar"> <p> <span style="{{#if:{{#invoke:Présentation|previous}}||visibility:hidden;}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#invoke:Présentation|previous}}]]</span> <span style="{{#if:{{#invoke:Présentation|next}}||visibility:hidden;}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#invoke:Présentation|next}}]]</span> {{#invoke:Présentation|current}}/{{#invoke:Présentation|total}} </p> </div> {{#if:{{{1|}}}|{{DISPLAYTITLE:{{{1}}}}}}} 702af1e3403dad7f07766185186cf42950b9237f 289 288 2015-04-12T21:15:33Z Seb35 1 syntaxe wikitext text/x-wiki <div id="presentation-bar-left" class="presentation-bar plainlinks"> <p>[[{{NAMESPACE}}:{{ROOTPAGENAME}}|<span style="color:#0645AD;">{{ROOTPAGENAME}}</span>]]<!-- --><span class="presentation-edit">&nbsp;– [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}</span>]</span><!-- --><span class="presentation-purge">&nbsp;– [{{fullurl:{{FULLPAGENAME}}|action=purge}} <span style="color:#0645AD;">purger</span>]</span><!-- --><span class="presentation-move">&nbsp;– [[{{#special:Movepage}}/{{FULLPAGENAME}}|<span style="color:#0645AD;">{{lc:{{int:move}}}}</span>]]</span></p> </div> <div id="presentation-bar-right" class="presentation-bar"> <p> <span style="{{#if:{{#invoke:Présentation|previous}}||visibility:hidden;}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#invoke:Présentation|previous}}]]</span> <span style="{{#if:{{#invoke:Présentation|next}}||visibility:hidden;}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#invoke:Présentation|next}}]]</span> {{#invoke:Présentation|current}}/{{#invoke:Présentation|total}} </p> </div> {{#if:{{{1|}}}|{{DISPLAYTITLE:{{{1}}}}}}} 6016cff5b417cee5b3a1d34bae6fe687835f689c Présentation:Wikis/1 104 99 271 227 2015-04-10T17:20:05Z Seb35 1 plan wikitext text/x-wiki Plan : # [[Présentation:Wikis/1/1|Définition d’un wiki]] # [[Présentation:Wikis/1/2|Historique des wikis]] # [[Présentation:Wikis/1/3|Focus sur la famille de wikis la plus connue : Wikipédia]] # [[Présentation:Wikis/1/4|Autres exemples de wikis]] # [[Présentation:Wikis/1/5|Questions juridiques]] {{Présentation|Présentation et histoire des wikis}} 827652824b85ec037f8798ad9d6bd4c2bb5f355c 285 271 2015-04-12T20:54:52Z Seb35 1 lien wikitext text/x-wiki Plan : # [[Présentation:Wikis/1/1|Définition d’un wiki]] # [[Présentation:Wikis/1/2|Historique des wikis]] # [[Présentation:Wikis/1/3|Focus sur la famille de wikis la plus connue : Wikipédia]] # [[Présentation:Wikis/1/4/1|Autres exemples de wikis]] : [[Présentation:Wikis/1/4/1|bases de connaissances thématiques]], [[Présentation:Wikis/1/4/2|wikis de travail]] # [[Présentation:Wikis/1/5|Questions juridiques]] {{Présentation|Présentation et histoire des wikis}} db5e4b21cc59c0ac77cd61a8a67a20b124585b7f 293 285 2015-04-12T21:37:46Z Seb35 1 typo wikitext text/x-wiki Plan : # [[Présentation:Wikis/1/1|Définition d’un wiki]] # [[Présentation:Wikis/1/2|Historique des wikis]] # [[Présentation:Wikis/1/3|Focus sur la famille de wikis la plus connue : Wikipédia]] # [[Présentation:Wikis/1/4/1|Autres exemples de wikis]] : [[Présentation:Wikis/1/4/1|bases de connaissances thématiques]] et [[Présentation:Wikis/1/4/2|wikis de travail]] # [[Présentation:Wikis/1/5|Questions juridiques]] {{Présentation|Présentation et histoire des wikis}} 6eba7faec06f86dd2ceb68c60e667ce0c48050d8 Présentation:Wikis/1/1 104 101 272 248 2015-04-10T17:21:10Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/2]] vers [[Présentation:Wikis/1/1]] sans laisser de redirection : utilisation de la fonctionnalité "hiérarchique" wikitext text/x-wiki <div class="plainlinks" style="width:70%; margin-top:4.5em; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;"> <span style="color:#9B85BE;">'''WIKI'''</span> <div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div> <span style="color:#9B85BE;">DÉFINITION(S)</span><br /> Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite » Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki. <span style="color:#9B85BE;">ORIGINE</span><br /> Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003 <span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br /> « Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. » Jérôme Delacroix, ''Les Wikis'' </div> Le mot « wiki » est un des mots à utiliser dans le concours de poésie et d’art ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015. </div> {{Présentation|Définition d’un wiki}} 2a1bdc0f52203f7f2a84c76e8393ce3bbdc47ad4 Présentation:Wikis/1/2 104 105 276 2015-04-10T17:53:14Z Seb35 1 init wikitext text/x-wiki <div style="height:33%;">1995 : création de l’outil par Ward Cunningham</div> <div style="height:33%;">2001 : lancement de Wikipédia</div> <div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div> {{Présentation|Historique des wikis}} cf6d6b672dc3658b9d0bc72932a4730a75c7ea02 296 276 2015-04-12T22:35:36Z Seb35 1 +image wikitext text/x-wiki <div style="height:33%;">1995 : création de l’outil par Ward Cunningham</div> <div style="height:33%;">2001 : lancement de Wikipédia [[Fichier:Old Wikipedia.png|right|Page d’accueil de Wikipédia le 28 septembre 2002]]</div> <div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div> {{Présentation|Historique des wikis}} 41f16aa8371bd6ac786e65d7a5b97e1273538348 297 296 2015-04-12T22:37:39Z Seb35 1 mise en page wikitext text/x-wiki <div style="height:33%;">1995 : création de l’outil par Ward Cunningham</div> <div style="height:33%;">2001 : lancement de Wikipédia [[Fichier:Old Wikipedia.png|right|60px|Page d’accueil de Wikipédia le 28 septembre 2002]]</div> <div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div> {{Présentation|Historique des wikis}} a00000738dfae9cb6b10856c67f8eccdcf1a2e57 298 297 2015-04-12T22:39:41Z Seb35 1 mise en page wikitext text/x-wiki <div style="height:33%;">1995 : création de l’outil par Ward Cunningham</div> <div style="height:33%;">2001 : lancement de Wikipédia [[Fichier:Old Wikipedia.png|right|Page d’accueil de Wikipédia le 28 septembre 2002]]</div> <div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div> {{Présentation|Historique des wikis}} 41f16aa8371bd6ac786e65d7a5b97e1273538348 299 298 2015-04-12T22:43:29Z Seb35 1 essai wikitext text/x-wiki <div style="height:33%;">1995 : création de l’outil par Ward Cunningham</div> <div style="height:33%;">2001 : lancement de Wikipédia [[Fichier:Old Wikipedia.png|class="test"|Page d’accueil de Wikipédia le 28 septembre 2002]]</div> <div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div> {{Présentation|Historique des wikis}} f3290904cb628d166e8956fbcf16f2f2740e5c9d 305 299 2015-04-20T10:26:42Z Seb35 1 mise en page wikitext text/x-wiki <div style="height:33%;">1995 : création de l’outil par Ward Cunningham</div> <div style="height:33%;">2001 : lancement de Wikipédia [[Fichier:Old Wikipedia.png|200px|thumb|right|Page d’accueil de Wikipédia le 28 septembre 2002]]</div> <div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div> {{Présentation|Historique des wikis}} d43c120429183637f5978b801f0294024f304912 307 305 2015-04-20T10:50:36Z Seb35 1 ++ wikitext text/x-wiki <div style="height:33%;">1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|{{noir|WikiWikiWeb}}]] par [[:frwikipedia:Ward Cunningham|{{noir|Ward Cunningham}}]] * toujours disponible sur http://c2.com/cgi/wiki * édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice {{noir|pour cause de spam}}]) [[Fichier:WikiWikiWeb screenshot.png|200px|thumb|right|Page d’accueil de Wikipédia le 28 septembre 2002]]</div> <div style="height:33%;">2001 : lancement de Wikipédia [[Fichier:Old Wikipedia.png|200px|thumb|right|Page d’accueil de Wikipédia le 28 septembre 2002]]</div> <div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div> {{Présentation|Historique des wikis}} 763b5227ffc6759f9c45858f92732f7c4716c537 311 307 2015-04-20T11:18:58Z Seb35 1 mise en page wikitext text/x-wiki <div style="height:33%;">1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|{{noir|WikiWikiWeb}}]] par [[:frwikipedia:Ward Cunningham|{{noir|Ward Cunningham}}]] [[Fichier:WikiWikiWeb screenshot.png|200px|thumb|right|Page d’accueil de WikiWikiWeb en 2003.]]</div> * toujours disponible sur http://c2.com/cgi/wiki * édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice {{noir|pour cause de spam}}]) <div style="height:33%;">2001 : lancement de Wikipédia [[Fichier:Old Wikipedia.png|200px|thumb|right|Page d’accueil de Wikipédia le 28 septembre 2002.]]</div> <div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div> {{Présentation|Historique des wikis}} 2d39aff7f7cb28e9982e5f3af0cae06e84c36795 312 311 2015-04-20T11:19:39Z Seb35 1 mise en page wikitext text/x-wiki <div style="height:33%;">1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|{{noir|WikiWikiWeb}}]] par [[:frwikipedia:Ward Cunningham|{{noir|Ward Cunningham}}]] [[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]]</div> * toujours disponible sur http://c2.com/cgi/wiki * édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice {{noir|pour cause de spam}}]) <div style="height:33%;">2001 : lancement de Wikipédia [[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]]</div> <div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div> {{Présentation|Historique des wikis}} 08eca9d5a58ff23446ee92643e9525ae641db1a7 313 312 2015-04-20T11:23:29Z Seb35 1 mise en page wikitext text/x-wiki <!-- Premier tiers en hauteur --><div style="height:33%;"> [[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]] 1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|{{noir|WikiWikiWeb}}]] par [[:frwikipedia:Ward Cunningham|{{noir|Ward Cunningham}}]] * toujours disponible sur http://c2.com/cgi/wiki * édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice {{noir|pour cause de spam}}]) </div><!-- Deuxième tiers en hauteur --><div style="height:33%;"> [[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]] 2001 : lancement de Wikipédia </div><!-- Troisième tiers en hauteur --><div style="height:33%;"> 2006-2010 : popularisation de Wikipédia et de l’outil </div> {{Présentation|Historique des wikis}} 7d6f7d0330bd55e8f702177ff1dba3780a86e40c Présentation:Wikis/1/4/1 104 106 277 2015-04-12T19:15:04Z Seb35 1 init wikitext text/x-wiki <div style="height:50%;"><div style="width:50%;">Vikidia<br />encyclopédie par et pour les enfants</div><div style="width:50%;">Ekopédia<br />savoir-faire en écologie</div></div> <div style="height:50%;"><div style="width:50%;">Wookieepedia<br />univers Star Wars</div><div style="width:50%;">OWASP<br />sécurité informatique</div></div> {{Présentation|Autres exemples de wikis : bases de connaissances thématiques}} 2dacac3edc9d043d73763ccef43c228daeb6b572 278 277 2015-04-12T19:15:57Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/1/3]] vers [[Présentation:Wikis/1/3/1]] sans laisser de redirection wikitext text/x-wiki <div style="height:50%;"><div style="width:50%;">Vikidia<br />encyclopédie par et pour les enfants</div><div style="width:50%;">Ekopédia<br />savoir-faire en écologie</div></div> <div style="height:50%;"><div style="width:50%;">Wookieepedia<br />univers Star Wars</div><div style="width:50%;">OWASP<br />sécurité informatique</div></div> {{Présentation|Autres exemples de wikis : bases de connaissances thématiques}} 2dacac3edc9d043d73763ccef43c228daeb6b572 281 278 2015-04-12T20:50:13Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/1/3/1]] vers [[Présentation:Wikis/1/4/1]] sans laisser de redirection wikitext text/x-wiki <div style="height:50%;"><div style="width:50%;">Vikidia<br />encyclopédie par et pour les enfants</div><div style="width:50%;">Ekopédia<br />savoir-faire en écologie</div></div> <div style="height:50%;"><div style="width:50%;">Wookieepedia<br />univers Star Wars</div><div style="width:50%;">OWASP<br />sécurité informatique</div></div> {{Présentation|Autres exemples de wikis : bases de connaissances thématiques}} 2dacac3edc9d043d73763ccef43c228daeb6b572 Présentation:Wikis/1/4/2 104 107 279 2015-04-12T19:19:37Z Seb35 1 init wikitext text/x-wiki <div style="width:50%;"><div style="height:50%;"></div><div style="height:50%;"></div></div> <div style="width:50%;"></div> {{Présentation|Autres exemples de wikis : wikis de travail}} e418fdc4dc78ef60b71a7c0fc051f7f195a86de5 282 279 2015-04-12T20:50:38Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/1/3/2]] vers [[Présentation:Wikis/1/4/2]] sans laisser de redirection wikitext text/x-wiki <div style="width:50%;"><div style="height:50%;"></div><div style="height:50%;"></div></div> <div style="width:50%;"></div> {{Présentation|Autres exemples de wikis : wikis de travail}} e418fdc4dc78ef60b71a7c0fc051f7f195a86de5 Présentation:Wikis/1/3 104 108 283 2015-04-12T20:52:01Z Seb35 1 init wikitext text/x-wiki * multilingue : quasiment 200 langues * communautés fortes * objectif spécifique : encyclopédie généraliste fd4988cbec3cc9fc9a230c14686ff96d760e99c3 284 283 2015-04-12T20:52:38Z Seb35 1 +titre wikitext text/x-wiki * multilingue : quasiment 200 langues * communautés fortes * objectif spécifique : encyclopédie généraliste {{Présentation|Focus sur la famille de wikis la plus connue : Wikipédia}} e1af404984d95eb76be093ba42d448eeadd099fb Modèle:Présentation/Wikis 10 109 286 2015-04-12T21:00:05Z Seb35 1 page pour activer le debug wikitext text/x-wiki debug=true 1dc04b6163c4228434a085f3cdcaa6bc51d9142d MediaWiki:Common.css 8 4 290 246 2015-04-12T21:17:44Z Seb35 1 display none présentation css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 96%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 2%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } e4dfa5c20aa0ea9fbfe86a8ab221b637dc07d977 294 290 2015-04-12T21:58:20Z Seb35 1 style présentation css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 100%; } .ns-104.action-view #mw-content-text { height: 100%; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 2%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } 2dae9c149ff7abaee48c869c0575a6da6206ccfb 295 294 2015-04-12T22:04:36Z Seb35 1 style présentation css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } 0bf3ae9ac2d6b0b0249f086f9bdab61ad4ec2504 308 295 2015-04-20T10:52:56Z Seb35 1 -icône lien externe dans les présentations css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } .ns-104.mw-body .external { background: none; } da5a3894cc0bb8b967b7affe40dd1bbb97f59226 309 308 2015-04-20T10:55:22Z Seb35 1 re css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } .ns-104 .mw-body .external { background: none; } 24b9f5e650660f40161ea54ea985d26252e57650 310 309 2015-04-20T10:56:28Z Seb35 1 re css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } .ns-104 .mw-body .external { background: none; padding-right: 0px; } 5556257a2d0ffbe22ad1cbd19eb26d85d5c2f9fc 314 310 2015-04-20T12:50:45Z Seb35 1 style des liens dans les présentations css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } /* Spécifique à la présentation sur les wikis */ .ns-104 .mw-body .external { background: none; padding-right: 0px; } .ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active, .ns-104 .mw-body .external.text, .ns-104 .mw-body .external.text:active { color: black; text-decoration: none; } 5c2efa3d21248b60fe3d60682fa8f061885fa504 Utilisateur:Seb35/common.css 2 110 291 2015-04-12T21:19:48Z Seb35 1 display présentation css text/css .ns-104 .presentation-edit, .ns-104 .presentation-purge, .ns-104 .presentation-move { display: inherit; } f85f06e242282dd2bd62b590b541d4e92ed9f943 292 291 2015-04-12T21:34:02Z Seb35 1 style présentation css text/css .ns-104 .presentation-edit, .ns-104 .presentation-purge, .ns-104 .presentation-move { display: inline; } 54a751ac4702d9186a47a43718a4d44f1e02c400 Modèles économiques alternatifs 0 111 300 2015-04-13T13:16:53Z Seb35 1 premier jet wikitext text/x-wiki Dans le cadre de [[:seb35:|mon entreprise]] (conseil en logiciels libres et création de logiciels libres), je m’intéresse à des modèles économiques « ''alternatifs'' » : le modèle économique dominant (achat-vente de biens et services ou autres valeurs, avec une notion d’échange de propriété) est peu adapté aux logiciels libres et plus largement aux [Biens] Communs immatériels – en gros tout ce qui est Connaissance, logiciels ou données ; la notion de propriété étant assez difficile à définir (voir douteuse selon les sensibilités), notamment du fait qu’il n’y a jamais échange mais duplication – on parle parfois d’[[:wikipedia:Économie de l'abondance|économie de l’abondance]]. Cette thématique étant en (co-)construction par de multiples acteurs (mondes associatif, de l’ESS, de l’Internet, et d’autres) et vu qu’il n’existe ni une seule bonne alternative et que les modèles économiques libres dépendent en partie de leur mise en œuvre effective, cette page n’a aucune prétention à sortir du chapeau ''le'' modèle économique libre qui fonctionne (ça n’existe pas) mais plutôt à recenser certains modèles économiques libres (voir [[#Liste de modèles économiques alternatifs]]). Il n’est pas fait mention des systèmes économiques plus globaux (économie du don/de l’abondance/d’usage/etc.) qui relèvent plus d’une part de la philosophie et d’autre part de l’effet d’échelle. D’autre part, il existe plusieurs sites et ressources sur le sujet (voir [[#Ressources]]). == Liste de modèles économiques alternatifs == * Bénévolat : offre de temps pour la réalisation de tâches, généralement d’intérêt général ** Bénévolat avec contrat de travail : bénévole régi par le même droit du travail qu’un salarié (droits et devoirs, temps de travail, accès aux ressources de la société, avantages réservés, etc.) * Don : financement inconditionnel d’un projet, pouvant être demandé avant, après ou pendant la réalisation d’un projet ** Microdon : petits dons destiné au financement de projets *** à-la-Gratipay : microdons réguliers (hebdomadaires) attribués soit à une personne (sous-entendu pour les projets libres dont elle s’occupe) soit à un groupe de personnes s’occupant d’un projet et qui se répartissent la somme au sein du groupe *** à-la-Flattr : microdons réguliers (mensuels) attribués à une personnes (sous-entendu pour les projets libres dont elle s’occupe) ** Hackadon : collecte auprès de grands donateurs puis redistribution entre plusieurs projets libres décidée collectivement lors d’un événement [http://www.withoutmodel.com/hugo-stephan/hackadon-soutenez-les-openmodels/ description sur WithoutModel] ** Financement participatif : dons demandés et affectés à un projet dans le cadre d’une campagne de communication, souvent avec un objectif de montant total minimum conditionnant le versement du financement *** Financement participatif de matériel : classiquement les financements participatifs financent du matériel nécessaire au projet, le temps de travail associé est bénévole ou rémunéré selon un autre mode de financement *** Financement participatif de temps de travail : financement du temps de travail nécessaire à la réalisation d’un projet normalement libre *** Financement participatif pour production de matériels : pré-achat d’un objet matériel, pour éviter au vendeur d’avoir à supporter les coûts de production ainsi que le risque de non-vente d’une partie du stock produit * Avantages fiscaux : financement par non-imposition ou réduction d’imposition lié au statut d’intérêt général de projets ** Crédit d’impôt Recherche : en France, réduction partielle de l’impôt sur les sociétés ou sur le revenu pour les activités de recherche et R&D ** Jeune entreprise innovante : en France, réduction des impôts pour les jeunes entreprises ayant des activités de recherche et R&D * Prix libre : vente classique d’un produit ou service à un prix librement décidé par l’acheteur ** Prix libre avec minimum : prix libre avec un minimum, par exemple correspondant au prix de revient * Subventionnement : financement généralement assez important dans le cadre d’une convention ou d’un contrat ** Subvention de fonctionnement : financement d’un projet avec une latitude d’utilisation du financement assez large, non-affectée de façon très spécifique * Troc : échange de services ** S.E.L. (Système d’Échange Local) : échange de services généralement indexé plus ou moins indirectement sur le temps passé * Financement par la création de fonctionnalités critiques ou le support : pour les logiciels ou services libres (sans aucune restriction), financement du projet global par financement venant de quelques grands clients demandant de nouvelles fonctionnalités critiques ou du support * Freemium : une partie des fonctionnalités ou accès est gratuite, une autre partie est payante ; généralement un grand nombre de fonctionnalités est disponible gratuitement (pour avoir une base d’utilisateurs assez importante) et un petit nombre de fonctionnalités cible de façon spécifique les clients pouvant se permettre de payer == Ressources == * [http://www.withoutmodel.com WithoutModel] 12a2b917508c96e152ec62e70f3c10d287b1de24 301 300 2015-04-13T13:22:09Z Seb35 1 précision wikitext text/x-wiki Dans le cadre de [[:seb35:|mon entreprise]] (conseil en logiciels libres et création de logiciels libres), je m’intéresse à des modèles économiques « ''alternatifs'' » : le modèle économique dominant (achat-vente de biens et services ou autres valeurs, avec une notion d’échange de propriété) est peu adapté aux logiciels libres et plus largement aux [Biens] Communs immatériels – en gros tout ce qui est Connaissance, logiciels ou données ; la notion de propriété étant assez difficile à définir (voir douteuse selon les sensibilités), notamment du fait qu’il n’y a jamais échange mais duplication – on parle parfois d’[[:wikipedia:Économie de l'abondance|économie de l’abondance]]. Cette thématique étant en (co-)construction par de multiples acteurs (mondes associatif, de l’ESS, de l’Internet, et d’autres) et vu qu’il n’existe ni une seule bonne alternative et que les modèles économiques libres dépendent en partie de leur mise en œuvre effective, cette page n’a aucune prétention à sortir du chapeau ''le'' modèle économique libre qui fonctionne (ça n’existe pas) mais plutôt à recenser certains modèles économiques libres (voir [[#Liste de modèles économiques alternatifs]]). Il n’est pas fait mention des systèmes économiques plus globaux (économie du don/de l’abondance/d’usage/etc.) qui relèvent plus d’une part de la philosophie et d’autre part de l’effet d’échelle. D’autre part, il existe plusieurs sites et ressources sur le sujet (voir [[#Ressources]]). == Liste de modèles économiques alternatifs == * Bénévolat : offre de temps pour la réalisation de tâches, généralement d’intérêt général ** Bénévolat avec contrat de travail : bénévole régi par le même droit du travail qu’un salarié (droits et devoirs, temps de travail, accès aux ressources de la société, avantages réservés, etc.) * Don : financement inconditionnel d’un projet, pouvant être demandé avant, après ou pendant la réalisation d’un projet ** Microdon : petits dons destiné au financement de projets *** à-la-Gratipay : microdons réguliers (hebdomadaires) attribués soit à une personne (sous-entendu pour les projets libres dont elle s’occupe) soit à un groupe de personnes s’occupant d’un projet et qui se répartissent la somme au sein du groupe *** à-la-Flattr : microdons réguliers (mensuels) attribués à une personnes (sous-entendu pour les projets libres dont elle s’occupe) ** Hackadon : collecte auprès de grands donateurs puis redistribution entre plusieurs projets libres décidée collectivement lors d’un événement [http://www.withoutmodel.com/hugo-stephan/hackadon-soutenez-les-openmodels/ description sur WithoutModel] ** Financement participatif : dons demandés et affectés à un projet dans le cadre d’une campagne de communication, souvent avec un objectif de montant total minimum conditionnant le versement du financement *** Financement participatif de matériel : classiquement les financements participatifs financent du matériel nécessaire au projet, le temps de travail associé est bénévole ou rémunéré selon un autre mode de financement *** Financement participatif de temps de travail : financement du temps de travail nécessaire à la réalisation d’un projet normalement libre *** Financement participatif pour production de matériels : pré-achat d’un objet matériel, pour éviter au vendeur d’avoir à supporter les coûts de production ainsi que le risque de non-vente d’une partie du stock produit * Avantages fiscaux : financement par non-imposition ou réduction d’imposition lié au statut d’intérêt général de projets ** Crédit d’impôt Recherche : en France, réduction partielle de l’impôt sur les sociétés ou sur le revenu pour les activités de recherche et R&D ** Jeune entreprise innovante : en France, réduction des impôts pour les jeunes entreprises ayant des activités de recherche et R&D * Prix libre : vente classique d’un produit ou service à un prix librement décidé par l’acheteur ** Prix libre avec minimum : prix libre avec un minimum, par exemple correspondant au prix de revient * Subventionnement : financement généralement assez important dans le cadre d’une convention ou d’un contrat ** Subvention de fonctionnement : financement d’un projet avec une latitude d’utilisation du financement assez large, non-affectée de façon très spécifique * Troc : échange de services ** S.E.L. (Système d’Échange Local) : échange de services généralement indexé plus ou moins indirectement sur le temps passé * Financement par la création de fonctionnalités critiques ou le support : pour les logiciels ou services libres (sans aucune restriction), financement du projet global par financement venant de quelques grands clients demandant de nouvelles fonctionnalités critiques ou du support ; similaire au financement participatif outre le fait que ce sont là des projets sur du long terme et que les financeurs d’une fonctionnalité sont soit uniques/seuls soit en nombre restreint * Freemium : une partie des fonctionnalités ou accès est gratuite, une autre partie est payante ; généralement un grand nombre de fonctionnalités est disponible gratuitement (pour avoir une base d’utilisateurs assez importante) et un petit nombre de fonctionnalités cible de façon spécifique les clients pouvant se permettre de payer == Ressources == * [http://www.withoutmodel.com WithoutModel] baaf7d6156697a3dcf79770ce9a181ae7ceb61c4 302 301 2015-04-13T13:26:51Z Seb35 1 ++ wikitext text/x-wiki Dans le cadre de [[:seb35:|mon entreprise]] (conseil en logiciels libres et création de logiciels libres), je m’intéresse à des modèles économiques « ''alternatifs'' » : le modèle économique dominant (achat-vente de biens et services ou autres valeurs, avec une notion d’échange de propriété) est peu adapté aux logiciels libres et plus largement aux [Biens] Communs immatériels – en gros tout ce qui est Connaissance, logiciels ou données ; la notion de propriété étant assez difficile à définir (voir douteuse selon les sensibilités), notamment du fait qu’il n’y a jamais échange mais duplication – on parle parfois d’[[:wikipedia:Économie de l'abondance|économie de l’abondance]]. Cette thématique étant en (co-)construction par de multiples acteurs (mondes associatif, de l’ESS, de l’Internet, et d’autres) et vu qu’il n’existe ni une seule bonne alternative et que les modèles économiques libres dépendent en partie de leur mise en œuvre effective, cette page n’a aucune prétention à sortir du chapeau ''le'' modèle économique libre qui fonctionne (ça n’existe pas) mais plutôt à recenser certains modèles économiques libres (voir [[#Liste de modèles économiques alternatifs]]). Il n’est pas fait mention des systèmes économiques plus globaux (économie du don/de l’abondance/d’usage/etc.) qui relèvent plus d’une part de la philosophie et d’autre part de l’effet d’échelle. D’autre part, il existe plusieurs sites et ressources sur le sujet (voir [[#Ressources]]). == Liste de modèles économiques alternatifs == * Bénévolat : offre de temps pour la réalisation de tâches, généralement d’intérêt général ** Bénévolat avec contrat de travail : bénévole régi par le même droit du travail qu’un salarié (droits et devoirs, temps de travail, accès aux ressources de la société, avantages réservés, etc.) * Mutualisation : financement/investissement collectif par réduction des coûts par la mise en commun d’un projet ou service entre plusieurs personnes ou entités – gain futur et global * Don : financement inconditionnel d’un projet, pouvant être demandé avant, après ou pendant la réalisation d’un projet ** Microdon : petits dons destiné au financement de projets *** à-la-Gratipay : microdons réguliers (hebdomadaires) attribués soit à une personne (sous-entendu pour les projets libres dont elle s’occupe) soit à un groupe de personnes s’occupant d’un projet et qui se répartissent la somme au sein du groupe *** à-la-Flattr : microdons réguliers (mensuels) attribués à une personnes (sous-entendu pour les projets libres dont elle s’occupe) ** Hackadon : collecte auprès de grands donateurs puis redistribution entre plusieurs projets libres décidée collectivement lors d’un événement [http://www.withoutmodel.com/hugo-stephan/hackadon-soutenez-les-openmodels/ description sur WithoutModel] ** Financement participatif : dons demandés et affectés à un projet dans le cadre d’une campagne de communication, souvent avec un objectif de montant total minimum conditionnant le versement du financement *** Financement participatif de matériel : classiquement les financements participatifs financent du matériel nécessaire au projet, le temps de travail associé est bénévole ou rémunéré selon un autre mode de financement *** Financement participatif de temps de travail : financement du temps de travail nécessaire à la réalisation d’un projet normalement libre *** Financement participatif pour production de matériels : pré-achat d’un objet matériel, pour éviter au vendeur d’avoir à supporter les coûts de production ainsi que le risque de non-vente d’une partie du stock produit * Avantages fiscaux : financement par non-imposition ou réduction d’imposition lié au statut d’intérêt général de projets ** Crédit d’impôt Recherche : en France, réduction partielle de l’impôt sur les sociétés ou sur le revenu pour les activités de recherche et R&D ** Jeune entreprise innovante : en France, réduction des impôts pour les jeunes entreprises ayant des activités de recherche et R&D * Prix libre : vente classique d’un produit ou service à un prix librement décidé par l’acheteur ** Prix libre avec minimum : prix libre avec un minimum, par exemple correspondant au prix de revient * Subventionnement : financement généralement assez important dans le cadre d’une convention ou d’un contrat ** Subvention de fonctionnement : financement d’un projet avec une latitude d’utilisation du financement assez large, non-affectée de façon très spécifique * Troc : échange de services ** S.E.L. (Système d’Échange Local) : échange de services généralement indexé plus ou moins indirectement sur le temps passé * Financement par la création de fonctionnalités critiques ou le support : pour les logiciels ou services libres (sans aucune restriction), financement du projet global par financement venant de quelques grands clients demandant de nouvelles fonctionnalités critiques ou du support ; similaire au financement participatif outre le fait que ce sont là des projets sur du long terme et que les financeurs d’une fonctionnalité sont soit uniques/seuls soit en nombre restreint * Freemium : une partie des fonctionnalités ou accès est gratuite, une autre partie est payante ; généralement un grand nombre de fonctionnalités est disponible gratuitement (pour avoir une base d’utilisateurs assez importante) et un petit nombre de fonctionnalités cible de façon spécifique les clients pouvant se permettre de payer == Ressources == * [http://www.withoutmodel.com WithoutModel] 1760247710c984bb6a1274c5491b756db8c84a53 303 302 2015-04-13T13:55:13Z Seb35 1 +1, début d’une liste de liens wikitext text/x-wiki Dans le cadre de [[:seb35:|mon entreprise]] (conseil en logiciels libres et création de logiciels libres), je m’intéresse à des modèles économiques « ''alternatifs'' » : le modèle économique dominant (achat-vente de biens et services ou autres valeurs, avec une notion d’échange de propriété) est peu adapté aux logiciels libres et plus largement aux [Biens] Communs immatériels – en gros tout ce qui est Connaissance, logiciels ou données ; la notion de propriété étant assez difficile à définir (voir douteuse selon les sensibilités), notamment du fait qu’il n’y a jamais échange mais duplication – on parle parfois d’[[:wikipedia:fr:Économie de l'abondance|économie de l’abondance]]. Cette thématique étant en (co-)construction par de multiples acteurs (mondes associatif, de l’ESS, de l’Internet, et d’autres) et vu qu’il n’existe ni une seule bonne alternative et que les modèles économiques libres dépendent en partie de leur mise en œuvre effective, cette page n’a aucune prétention à sortir du chapeau ''le'' modèle économique libre qui fonctionne (ça n’existe pas) mais plutôt à recenser certains modèles économiques libres (voir [[#Liste de modèles économiques alternatifs]]). Il n’est pas fait mention des systèmes économiques plus globaux (économie du don/de l’abondance/d’usage/etc.) qui relèvent plus d’une part de la philosophie et d’autre part de l’effet d’échelle. D’autre part, il existe plusieurs sites et ressources sur le sujet (voir [[#Ressources]]). == Liste de modèles économiques alternatifs == * Bénévolat : offre de temps pour la réalisation de tâches, généralement d’intérêt général ** Bénévolat avec contrat de travail : bénévole régi par le même droit du travail qu’un salarié (droits et devoirs, temps de travail, accès aux ressources de la société, avantages réservés, etc.) ** Bénévolat contre fourniture de ressources : mise à disposition de ressources nécessaires à la réalisation d’un projet ; par exemple les hackathons dans lesquels les participants bénévoles se voient offerts la nourriture, l’hébergement et la mise à disposition des ressources requises pour le bon achèvement du projet * Mutualisation : financement/investissement collectif par réduction des coûts par la mise en commun d’un projet ou service entre plusieurs personnes ou entités – gain futur et global * Don : financement inconditionnel d’un projet, pouvant être demandé avant, après ou pendant la réalisation d’un projet ** Microdon : petits dons destiné au financement de projets *** à-la-Gratipay : microdons réguliers (hebdomadaires) attribués soit à une personne (sous-entendu pour les projets libres dont elle s’occupe) soit à un groupe de personnes s’occupant d’un projet et qui se répartissent la somme au sein du groupe *** à-la-Flattr : microdons réguliers (mensuels) attribués à une personnes (sous-entendu pour les projets libres dont elle s’occupe) ** Hackadon : collecte auprès de grands donateurs puis redistribution entre plusieurs projets libres décidée collectivement lors d’un événement [http://www.withoutmodel.com/hugo-stephan/hackadon-soutenez-les-openmodels/ description sur WithoutModel] ** Financement participatif : dons demandés et affectés à un projet dans le cadre d’une campagne de communication, souvent avec un objectif de montant total minimum conditionnant le versement du financement *** Financement participatif de matériel : classiquement les financements participatifs financent du matériel nécessaire au projet, le temps de travail associé est bénévole ou rémunéré selon un autre mode de financement *** Financement participatif de temps de travail : financement du temps de travail nécessaire à la réalisation d’un projet normalement libre *** Financement participatif pour production de matériels : pré-achat d’un objet matériel, pour éviter au vendeur d’avoir à supporter les coûts de production ainsi que le risque de non-vente d’une partie du stock produit * Avantages fiscaux : financement par non-imposition ou réduction d’imposition lié au statut d’intérêt général de projets ** Crédit d’impôt Recherche : en France, réduction partielle de l’impôt sur les sociétés ou sur le revenu pour les activités de recherche et R&D ** Jeune entreprise innovante : en France, réduction des impôts pour les jeunes entreprises ayant des activités de recherche et R&D * Prix libre : vente classique d’un produit ou service à un prix librement décidé par l’acheteur ** Prix libre avec minimum : prix libre avec un minimum, par exemple correspondant au prix de revient * Subventionnement : financement généralement assez important dans le cadre d’une convention ou d’un contrat ** Subvention de fonctionnement : financement d’un projet avec une latitude d’utilisation du financement assez large, non-affectée de façon très spécifique * Troc : échange de services ** S.E.L. (Système d’Échange Local) : échange de services généralement indexé plus ou moins indirectement sur le temps passé * Financement par la création de fonctionnalités critiques ou le support : pour les logiciels ou services libres (sans aucune restriction), financement du projet global par financement venant de quelques grands clients demandant de nouvelles fonctionnalités critiques ou du support ; similaire au financement participatif outre le fait que ce sont là des projets sur du long terme et que les financeurs d’une fonctionnalité sont soit uniques/seuls soit en nombre restreint * Freemium : une partie des fonctionnalités ou accès est gratuite, une autre partie est payante ; généralement un grand nombre de fonctionnalités est disponible gratuitement (pour avoir une base d’utilisateurs assez importante) et un petit nombre de fonctionnalités cible de façon spécifique les clients pouvant se permettre de payer == Liste de ressources sur les modèles économiques alternatifs == === Freemium === * [http://www.withoutmodel.com/chloe-bonnet/open-data-killer-app-leconomie-plate-formes/ ''Open data : de la killer app à l’économie des plate-formes'', par Chloé Bonnet et Romain Lalanne, le 17 février 2015 sur WithoutModel.com] == Ressources == * [http://www.withoutmodel.com WithoutModel] a0449d76fe4bc672cdb81700bc2afb1b424c6388 304 303 2015-04-13T14:05:30Z Seb35 1 typo, +ordre dans la liste wikitext text/x-wiki Dans le cadre de [[:seb35:|mon entreprise]] (conseil en logiciels libres et création de logiciels libres), je m’intéresse à des modèles économiques « ''alternatifs'' » : le modèle économique dominant (achat-vente de biens et services ou autres valeurs, avec une notion d’échange de propriété) est peu adapté aux logiciels libres et plus largement aux [Biens] Communs immatériels – en gros tout ce qui est Connaissance, logiciels ou données ; la notion de propriété étant assez difficile à définir (voir douteuse selon les sensibilités), notamment du fait qu’il n’y a jamais échange mais duplication – on parle parfois d’[[:wikipedia:fr:Économie de l'abondance|économie de l’abondance]]. Cette thématique étant en (co-)construction par de multiples acteurs (mondes associatif, de l’ESS, de l’Internet, et d’autres) et vu qu’il n’existe ni une seule bonne alternative et que les modèles économiques libres dépendent en partie de leur mise en œuvre effective, cette page n’a aucune prétention à sortir du chapeau ''le'' modèle économique libre qui fonctionne (ça n’existe pas) mais plutôt à recenser certains modèles économiques libres (voir [[#Liste de modèles économiques alternatifs]]). Il n’est pas fait mention des systèmes économiques plus globaux (économie du don/de l’abondance/d’usage/etc.) qui relèvent plus d’une part de la philosophie et d’autre part de l’effet d’échelle. D’autre part, il existe plusieurs sites et ressources sur le sujet (voir [[#Ressources]]). == Liste de modèles économiques alternatifs == Plus ou moins ordonnée du bénévolat (financement par gratuité extrême) vers l’échange avec une plus grande part de monnaie impliquée (financement plus inscrit dans le modèle économique achat-vente). * '''Bénévolat''' : offre de temps pour la réalisation de tâches, généralement d’intérêt général ** '''Bénévolat avec contrat de travail''' : bénévole régi par le même droit du travail qu’un salarié (droits et devoirs, temps de travail, accès aux ressources de la société, avantages réservés, etc.) ** '''Bénévolat contre fourniture de ressources''' : mise à disposition de ressources nécessaires à la réalisation d’un projet ; par exemple les hackathons dans lesquels les participants bénévoles se voient offerts la nourriture, l’hébergement et la mise à disposition des ressources requises pour le bon achèvement du projet * '''Mutualisation''' : financement/investissement collectif par réduction des coûts par la mise en commun d’un projet ou service entre plusieurs personnes ou entités – gain futur et global * '''Don''' : financement inconditionnel d’un projet, pouvant être demandé avant, après ou pendant la réalisation d’un projet ** '''Microdon''' : petits dons destiné au financement de projets *** '''Microdon à-la-Gratipay''' : microdons réguliers (hebdomadaires) attribués soit à une personne (sous-entendu pour les projets libres dont elle s’occupe) soit à un groupe de personnes s’occupant d’un projet et qui se répartissent la somme au sein du groupe *** '''Microdon à-la-Flattr''' : microdons réguliers (mensuels) attribués à une personnes (sous-entendu pour les projets libres dont elle s’occupe) ** '''[[#Hackadon|Hackadon]]''' : collecte auprès de grands donateurs puis redistribution entre plusieurs projets libres décidée collectivement lors d’un événement ** '''Financement participatif''' : dons demandés et affectés à un projet dans le cadre d’une campagne de communication, souvent avec un objectif de montant total minimum conditionnant le versement du financement *** '''Financement participatif de matériel''' : classiquement les financements participatifs financent du matériel nécessaire au projet, le temps de travail associé est bénévole ou rémunéré selon un autre mode de financement *** '''Financement participatif de temps de travail''' : financement du temps de travail nécessaire à la réalisation d’un projet normalement libre *** '''Financement participatif pour production de matériels''' : pré-achat d’un objet matériel, pour éviter au vendeur d’avoir à supporter les coûts de production ainsi que le risque de non-vente d’une partie du stock produit * '''Troc''' : échange de services ** '''S.E.L. (Système d’Échange Local)''' : échange de services généralement indexé plus ou moins indirectement sur le temps passé * '''Prix libre''' : vente classique d’un produit ou service à un prix librement décidé par l’acheteur ** '''Prix libre avec minimum''' : prix libre avec un minimum, par exemple correspondant au prix de revient * '''Avantages fiscaux''' : financement par non-imposition ou réduction d’imposition lié au statut d’intérêt général de projets ** '''Crédit d’impôt Recherche''' : en France, réduction partielle de l’impôt sur les sociétés ou sur le revenu pour les activités de recherche et R&D ** '''Jeune entreprise innovante''' : en France, réduction des impôts pour les jeunes entreprises ayant des activités de recherche et R&D * '''Subventionnement''' : financement généralement assez important dans le cadre d’une convention ou d’un contrat ** '''Subvention de fonctionnement''' : financement d’un projet avec une latitude d’utilisation du financement assez large, non-affectée de façon très spécifique * '''Financement par la création de fonctionnalités critiques ou le support''' : pour les logiciels ou services libres (sans aucune restriction), financement du projet global par financement venant de quelques grands clients demandant de nouvelles fonctionnalités critiques ou du support ; similaire au financement participatif outre le fait que ce sont là des projets sur du long terme et que les financeurs d’une fonctionnalité sont soit uniques/seuls soit en nombre restreint * '''[[#Freemium|Freemium]]''' : une partie des fonctionnalités ou accès est gratuite, une autre partie est payante ; généralement un grand nombre de fonctionnalités est disponible gratuitement (pour avoir une base d’utilisateurs assez importante) et un petit nombre de fonctionnalités cible de façon spécifique les clients pouvant se permettre de payer == Liste de ressources sur les modèles économiques alternatifs == === Hackadon === * [http://www.withoutmodel.com/hugo-stephan/hackadon-soutenez-les-openmodels/ ''Hackadon : soutenez les #openmodels'', par Hugo Stéphan, le 23 janvier 2015 sur WithoutModel.com] === Freemium === * [http://www.withoutmodel.com/chloe-bonnet/open-data-killer-app-leconomie-plate-formes/ ''Open data : de la killer app à l’économie des plate-formes'', par Chloé Bonnet et Romain Lalanne, le 17 février 2015 sur WithoutModel.com] == Ressources == * [http://www.withoutmodel.com WithoutModel] e7e554686deb13909a33beee5532c5d7a4018395 Modèle:Noir 10 112 306 2015-04-20T10:49:01Z Seb35 1 création wikitext text/x-wiki <span style="color:black;">{{{1}}}</span> 328eb39b232f88c21e394337b54b8a08b17389d6 MediaWiki:Common.css 8 4 315 314 2015-04-20T13:02:35Z Seb35 1 re css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } /* Spécifique à la présentation sur les wikis */ .ns-104 .mw-body .external { background: none; padding-right: 0px; } .ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active, .ns-104 .mw-body .external.text, .ns-104 .mw-body .external.text:active { color: black; text-decoration: none; border-bottom: 1px dotted black; } 93713fb0ef69ba5cd2934dd04906dc65f9979330 316 315 2015-04-20T13:05:08Z Seb35 1 dotted au passage de la souris css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } /* Spécifique à la présentation sur les wikis */ .ns-104 .mw-body .external { background: none; padding-right: 0px; } .ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active, .ns-104 .mw-body .external, .ns-104 .mw-body .external:active { color: black; text-decoration: none; } .ns-104 .mw-body a.extiw:active, .ns-104 .mw-body .external.text:active, .ns-104 .mw-body .external.free:active { border-bottom: 1px dotted black; } dd4c165419cda67855fecf1a05bccab5e9da0bcd 317 316 2015-04-20T13:06:38Z Seb35 1 re css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } /* Spécifique à la présentation sur les wikis */ .ns-104 .mw-body .external { background: none; padding-right: 0px; } .ns-104 .mw-body a.extiw, .ns-104 .mw-body .external { color: black; text-decoration: none; } .ns-104 .mw-body a.extiw:active, .ns-104 .mw-body .external.text:active, .ns-104 .mw-body .external.free:active { border-bottom: 1px dotted black; } 035b6013c0e3c20e57838a0d8927cfd61f0db98d 318 317 2015-04-20T13:10:03Z Seb35 1 re css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } /* Spécifique à la présentation sur les wikis */ .ns-104 .mw-body .external { background: none; padding-right: 0px; } .ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active, .ns-104 .mw-body .external, .ns-104 .mw-body .external:active { color: black; text-decoration: none; } .ns-104 .mw-body a.extiw:hover, .ns-104 .mw-body .external:hover { border-bottom: 1px dotted black; } 483fa7a352b711530cb337098416147632860a8a 319 318 2015-04-20T13:15:33Z Seb35 1 taille du texte css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 .mw-body-content { font-size: 0.975em; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } /* Spécifique à la présentation sur les wikis */ .ns-104 .mw-body .external { background: none; padding-right: 0px; } .ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active, .ns-104 .mw-body .external, .ns-104 .mw-body .external:active { color: black; text-decoration: none; } .ns-104 .mw-body a.extiw:hover, .ns-104 .mw-body .external:hover { border-bottom: 1px dotted black; } 2c57deb15f8dbc91b821d56f05f62a9b87f40dec 323 319 2015-04-20T13:53:51Z Seb35 1 css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 .mw-body-content { font-size: 0.975em; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } /* Spécifique à la présentation sur les wikis */ .ns-104 .mw-body .external { background: none; padding-right: 0px; } .ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active, .ns-104 .mw-body .external, .ns-104 .mw-body .external:active { color: black; text-decoration: none; } .ns-104 .mw-body a.extiw:hover, .ns-104 .mw-body .external:hover { border-bottom: 1px dotted black; } .ns-104 ul { line-height: 2em; } 895bffaa503e12291bb8eca30be11bb54a0c270b 355 323 2015-04-20T19:29:29Z Seb35 1 css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 .mw-body-content { font-size: 0.975em; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } /* Spécifique à la présentation sur les wikis */ .ns-104 .mw-body .external { background: none; padding-right: 0px; } .ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active, .ns-104 .mw-body .external, .ns-104 .mw-body .external:active { color: black; text-decoration: none; } .ns-104 .mw-body a.extiw:hover, .ns-104 .mw-body .external:hover { border-bottom: 1px dotted black; } .ns-104 ul, .ns-104 ol { line-height: 2em; } d86706e35b5e97661495b94f25c0acc47b6ce149 Présentation:Wikis/1/2 104 105 320 313 2015-04-20T13:33:23Z Seb35 1 style wikitext text/x-wiki <!-- Premier tiers en hauteur --><div style="height:33%;"> [[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]] 1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|WikiWikiWeb]] par [[:frwikipedia:Ward Cunningham|Ward Cunningham]] * toujours disponible sur http://c2.com/cgi/wiki * édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice pour cause de spam]) </div><!-- Deuxième tiers en hauteur --><div style="height:33%;"> [[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]] 2001 : lancement de Wikipédia </div><!-- Troisième tiers en hauteur --><div style="height:33%;"> 2006-2010 : popularisation de Wikipédia et de l’outil </div> {{Présentation|Historique des wikis}} 361310864e5ef2cbcf25620818d07ac1983e2a53 321 320 2015-04-20T13:34:44Z Seb35 1 style wikitext text/x-wiki <!-- Premier tiers en hauteur --><div style="height:33%;"> [[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]] 1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|WikiWikiWeb]] par [[:frwikipedia:Ward Cunningham|Ward Cunningham]] * toujours disponible sur <tt>http://c2.com/cgi/wiki</tt> * édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice pour cause de spam]) </div><!-- Deuxième tiers en hauteur --><div style="height:33%;"> [[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]] 2001 : lancement de Wikipédia </div><!-- Troisième tiers en hauteur --><div style="height:33%;"> 2006-2010 : popularisation de Wikipédia et de l’outil </div> {{Présentation|Historique des wikis}} 810525497136c2ec4adc34a9da7bd8ba9dab97a5 358 321 2015-04-20T19:35:51Z Seb35 1 simplification du wikitexte wikitext text/x-wiki {{Ligne présentation|3|1| [[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]] 1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|WikiWikiWeb]] par [[:frwikipedia:Ward Cunningham|Ward Cunningham]] * toujours disponible sur <tt>http://c2.com/cgi/wiki</tt> * édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice pour cause de spam]) }} {{Ligne présentation|3|1| [[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]] 2001 : lancement de Wikipédia }} {{Ligne présentation|3|1| 2006-2010 : popularisation de Wikipédia et de l’outil }} {{Présentation|Historique des wikis}} 499a486d88c350eb93847fb2fac1d566c9ba5a75 Présentation:Wikis/1/3 104 108 322 284 2015-04-20T13:52:15Z Seb35 1 ++ wikitext text/x-wiki <span style="line-height:2em;"> * Multilingue : quasiment 200 langues ** Éditions linguistiques indépendantes : pas de liens éditoriaux entre les langues (mais traductions autorisées) * Communautés fortes et indépendantes ** Règles régissant la vie en communauté ; par exemple sur la Wikipédia en français, [[:frwikipedia:Wikipédia:Pas d'attaque personnelle|une règle interdit explicitement les attaques personnelles]] * Objectif spécifique : encyclopédie généraliste ** Piliers fondateurs communs à toutes les langues : [[:frwikipedia:Wikipédia:Wikipédia est une encyclopédie|encyclopédie]], [[:frwikipedia:Wikipédia:Neutralité de point de vue|neutralité]], [[:frwikipedia:Wikipédia:Droit d'auteur|Droit d’auteur]], [[:frwikipedia:Wikipédia:Règles de savoir-vivre|savoir-vivre]], [[:frwikipedia:Wikipédia:Interprétation créative des règles|pas d’autre règle fixe]] ** Décisions éditoriales propres à chaque communauté ; par exemple sur la Wikipédia en français, [[:frwikipedia:Wikipédia:Critères d'admissibilité des articles|des critères d’admissibilité existent <small>et sont détaillés</small>]] * Statistiques (mars 2015) : [http://www.alexa.com/siteinfo/wikipedia.org 6e site mondial], [https://reportcard.wmflabs.org/graphs/unique_visitors 437 millions de visiteurs par mois], [https://reportcard.wmflabs.org/graphs/pageviews 20 milliards de pages vues par mois], [https://reportcard.wmflabs.org/graphs/active_editors 77 000 contributeurs par mois] </span> {{Présentation|Focus sur la famille de wikis la plus connue : Wikipédia}} 8808f99bbb518a240833e61a56e028ab6dfaf224 324 322 2015-04-20T13:54:35Z Seb35 1 mise en page wikitext text/x-wiki <div style="margin: auto 0;"> * Multilingue : quasiment 200 langues ** Éditions linguistiques indépendantes : pas de liens éditoriaux entre les langues (mais traductions autorisées) * Communautés fortes et indépendantes ** Règles régissant la vie en communauté ; par exemple sur la Wikipédia en français, [[:frwikipedia:Wikipédia:Pas d'attaque personnelle|une règle interdit explicitement les attaques personnelles]] * Objectif spécifique : encyclopédie généraliste ** Piliers fondateurs communs à toutes les langues : [[:frwikipedia:Wikipédia:Wikipédia est une encyclopédie|encyclopédie]], [[:frwikipedia:Wikipédia:Neutralité de point de vue|neutralité]], [[:frwikipedia:Wikipédia:Droit d'auteur|Droit d’auteur]], [[:frwikipedia:Wikipédia:Règles de savoir-vivre|savoir-vivre]], [[:frwikipedia:Wikipédia:Interprétation créative des règles|pas d’autre règle fixe]] ** Décisions éditoriales propres à chaque communauté ; par exemple sur la Wikipédia en français, [[:frwikipedia:Wikipédia:Critères d'admissibilité des articles|des critères d’admissibilité existent <small>et sont détaillés</small>]] * Statistiques (mars 2015) : [http://www.alexa.com/siteinfo/wikipedia.org 6e site mondial], [https://reportcard.wmflabs.org/graphs/unique_visitors 437 millions de visiteurs par mois], [https://reportcard.wmflabs.org/graphs/pageviews 20 milliards de pages vues par mois], [https://reportcard.wmflabs.org/graphs/active_editors 77 000 contributeurs par mois] </div> {{Présentation|Focus sur la famille de wikis la plus connue : Wikipédia}} 7e6bcc731f831bf976a0950a5ddc0bcf430fd4fa 325 324 2015-04-20T14:09:20Z Seb35 1 ++ wikitext text/x-wiki <div style="margin: auto 0;"> * Multilingue : quasiment 200 langues ** Éditions linguistiques indépendantes : pas de liens éditoriaux entre les langues (mais traductions autorisées) * Communautés fortes et indépendantes ** Règles régissant la vie en communauté — par ex. sur fr.WP, [[:frwikipedia:Wikipédia:Pas d'attaque personnelle|une règle interdit explicitement les attaques personnelles]] ** Différents statuts variant selon les communautés * Objectif spécifique : encyclopédie généraliste ** Piliers fondateurs communs : [[:frwikipedia:Wikipédia:Wikipédia est une encyclopédie|encyclopédie]], [[:frwikipedia:Wikipédia:Neutralité de point de vue|neutralité]], [[:frwikipedia:Wikipédia:Droit d'auteur|droit d’auteur]], [[:frwikipedia:Wikipédia:Règles de savoir-vivre|savoir-vivre]], [[:frwikipedia:Wikipédia:Interprétation créative des règles|pas d’autre règle fixe]] ** Décisions éditoriales locales — par ex. sur fr.WP, [[:frwikipedia:Wikipédia:Critères d'admissibilité des articles|des critères d’admissibilité existent <small>(et sont détaillés)</small>]] * Statistiques (mars 2015) : [http://www.alexa.com/siteinfo/wikipedia.org 6e site mondial], [https://reportcard.wmflabs.org/graphs/unique_visitors 437 millions de visiteurs par mois], [https://reportcard.wmflabs.org/graphs/pageviews 20 milliards de pages vues par mois], [https://reportcard.wmflabs.org/graphs/active_editors 77 000 contributeurs par mois] * Un logiciel conçu pour Wikipédia : [[:mw:|MediaWiki]] (moteur de wiki) </div> {{Présentation|Focus sur la famille de wikis la plus connue : Wikipédia}} e3595c320949371d64de519af51918fcf96e6481 Fichier:Vikidia 2015-04-20.png 6 113 326 2015-04-20T14:18:58Z Seb35 1 Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. wikitext text/x-wiki Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. 06c959dab9ac467dfa55d90dd26e294ebdb4c72e 337 326 2015-04-20T15:17:08Z Seb35 1 +lien wikitext text/x-wiki Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. Page originale : https://fr.vikidia.org/ 89ec90a119a584ca2f64da03605731c656a0972f Fichier:Ékopédia 2015-04-20.png 6 114 327 2015-04-20T14:19:46Z Seb35 1 Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. wikitext text/x-wiki Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. 06c959dab9ac467dfa55d90dd26e294ebdb4c72e 339 327 2015-04-20T15:18:13Z Seb35 1 +lien wikitext text/x-wiki Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. Page originale : http://fr.ekopedia.org/ 7ea0817c8a631bb95f5dcad3aea39f0046e7d287 Fichier:OWASP 2015-04-20.png 6 115 328 2015-04-20T14:21:10Z Seb35 1 Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. wikitext text/x-wiki Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. 06c959dab9ac467dfa55d90dd26e294ebdb4c72e 340 328 2015-04-20T15:20:39Z Seb35 1 +lien wikitext text/x-wiki Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. Page originale : https://www.owasp.org/ 3d8dd4b42a416f0e0d8ed80eee3a293b30adcc2c Fichier:Wookieepedia 2015-04-20.png 6 116 329 2015-04-20T14:22:01Z Seb35 1 Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. wikitext text/x-wiki Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. 06c959dab9ac467dfa55d90dd26e294ebdb4c72e 341 329 2015-04-20T15:21:09Z Seb35 1 +lien wikitext text/x-wiki Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. Page originale : http://starwars.wikia.com/ a1dcf2fbe9dffb7ce58c800f70d63ecc7fae26aa Présentation:Wikis/1/4/1 104 106 330 281 2015-04-20T14:37:31Z Seb35 1 +images wikitext text/x-wiki <div style="height:50%;"><div style="width:50%;">Vikidia<br />encyclopédie par et pour les enfants[[Fichier:Vikidia 2015-04-20.png|none]]</div><div style="left:50%; width:50%;">Ekopédia<br />savoir-faire en écologie[[Fichier:Ékopédia 2015-04-20.png|none]]</div></div> <div style="height:50%;"><div style="width:50%;">Wookieepedia<br />univers Star Wars[[Fichier:Wookieepedia 2015-04-20.png|none]]</div><div style="left:50%; width:50%;">OWASP<br />sécurité informatique[[Fichier:OWASP 2015-04-20.png|none]]</div></div> {{Présentation|Autres exemples de wikis : bases de connaissances thématiques}} b57de2a68e80ad45398c585d654bf95cb73b2b31 331 330 2015-04-20T14:39:27Z Seb35 1 tailles wikitext text/x-wiki <div style="height:50%;"><div style="width:50%;">Vikidia<br />encyclopédie par et pour les enfants[[Fichier:Vikidia 2015-04-20.png|none|200px]]</div><div style="left:50%; width:50%;">Ekopédia<br />savoir-faire en écologie[[Fichier:Ékopédia 2015-04-20.png|none|200px]]</div></div> <div style="height:50%;"><div style="width:50%;">Wookieepedia<br />univers Star Wars[[Fichier:Wookieepedia 2015-04-20.png|none|200px]]</div><div style="left:50%; width:50%;">OWASP<br />sécurité informatique[[Fichier:OWASP 2015-04-20.png|none|200px]]</div></div> {{Présentation|Autres exemples de wikis : bases de connaissances thématiques}} 94f4de8b967888b13251a5a8e19435ec9d0ba3db 332 331 2015-04-20T14:44:23Z Seb35 1 wikitext text/x-wiki <div style="height:50%;"><div style="width:50%; display:inline-table;">Vikidia<br />encyclopédie par et pour les enfants[[Fichier:Vikidia 2015-04-20.png|none|300px]]</div><div style="width:50%; display:inline-table;">Ekopédia<br />savoir-faire en écologie[[Fichier:Ékopédia 2015-04-20.png|none|300px]]</div></div> <div style="height:50%;"><div style="width:50%; display:inline-table;">Wookieepedia<br />univers Star Wars[[Fichier:Wookieepedia 2015-04-20.png|none|300px]]</div><div style="width:50%; display:inline-table;">OWASP<br />sécurité informatique[[Fichier:OWASP 2015-04-20.png|none|300px]]</div></div> {{Présentation|Autres exemples de wikis : bases de connaissances thématiques}} 9a5fec22298ea2bf0bf38118f5a24a431a4ddd96 333 332 2015-04-20T14:49:07Z Seb35 1 wikitext text/x-wiki <div style="height:50%;"><div style="width:50%; display:inline-table;">Vikidia<br />encyclopédie par et pour les enfants[[Fichier:Vikidia 2015-04-20.png|none|center|350px]]</div><div style="width:50%; display:inline-table;">Ekopédia<br />savoir-faire en écologie[[Fichier:Ékopédia 2015-04-20.png|none|center|350px]]</div></div> <div style="height:50%;"><div style="width:50%; display:inline-table;">Wookieepedia<br />univers Star Wars[[Fichier:Wookieepedia 2015-04-20.png|none|center|350px]]</div><div style="width:50%; display:inline-table;">OWASP<br />sécurité informatique[[Fichier:OWASP 2015-04-20.png|none|center|350px]]</div></div> {{Présentation|Autres exemples de wikis : bases de connaissances thématiques}} c65acded1eaad9e1a3f2fbfa335ae6f036acca60 334 333 2015-04-20T14:50:06Z Seb35 1 wikitext text/x-wiki <div style="height:50%;"><div style="width:50%; display:inline-table;">Vikidia<br />encyclopédie par et pour les enfants[[Fichier:Vikidia 2015-04-20.png|center|350px]]</div><div style="width:50%; display:inline-table;">Ekopédia<br />savoir-faire en écologie[[Fichier:Ékopédia 2015-04-20.png|center|350px]]</div></div> <div style="height:50%;"><div style="width:50%; display:inline-table;">Wookieepedia<br />univers Star Wars[[Fichier:Wookieepedia 2015-04-20.png|center|350px]]</div><div style="width:50%; display:inline-table;">OWASP<br />sécurité informatique[[Fichier:OWASP 2015-04-20.png|center|350px]]</div></div> {{Présentation|Autres exemples de wikis : bases de connaissances thématiques}} dff655d9d181a7b2d85070f3b82e6f3b2139611b 335 334 2015-04-20T14:55:57Z Seb35 1 mise en page, +liens wikitext text/x-wiki <div style="height:50%; text-align:center;"><div style="width:50%; display:inline-table;">[https://fr.vikidia.org/ Vikidia]<br />encyclopédie par et pour les enfants[[Fichier:Vikidia 2015-04-20.png|center|350px]]</div><div style="width:50%; display:inline-table;">[http://fr.ekopedia.org/ Ékopédia]<br />savoir-faire en écologie[[Fichier:Ékopédia 2015-04-20.png|center|350px]]</div></div> <div style="height:50%; text-align:center;"><div style="width:50%; display:inline-table;">[http://starwars.wikia.com/ Wookieepedia]<br />univers Star Wars[[Fichier:Wookieepedia 2015-04-20.png|center|350px]]</div><div style="width:50%; display:inline-table;">[https://www.owasp.org/ OWASP]<br />sécurité informatique[[Fichier:OWASP 2015-04-20.png|center|350px]]</div></div> {{Présentation|Autres exemples de wikis : bases de connaissances thématiques}} 7033fa1473aa73999d5197879c1a40eb58d900b5 350 335 2015-04-20T15:53:39Z Seb35 1 wikitexte plus lisible wikitext text/x-wiki {{Ligne présentation|2|2|css=text-align:center; | [https://fr.vikidia.org/ Vikidia] <br /> encyclopédie par et pour les enfants [[Fichier:Vikidia 2015-04-20.png|center|350px]] | [http://fr.ekopedia.org/ Ékopédia] <br /> savoir-faire en écologie [[Fichier:Ékopédia 2015-04-20.png|center|350px]] }} {{Ligne présentation|2|2|css=text-align:center; | [http://starwars.wikia.com/ Wookieepedia] <br /> univers Star Wars [[Fichier:Wookieepedia 2015-04-20.png|center|350px]] | [https://www.owasp.org/ OWASP] <br /> sécurité informatique [[Fichier:OWASP 2015-04-20.png|center|350px]] }} {{Présentation|Autres exemples de wikis : bases de connaissances thématiques}} 447a126398aa3c7d5f81420636299b65707118f1 Fichier:Meta-Wiki 2015-04-20.png 6 117 336 2015-04-20T15:16:10Z Seb35 1 Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. Page originale : https://meta.wikimedia.org/ wikitext text/x-wiki Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. Page originale : https://meta.wikimedia.org/ c9995c4ea86b19040e6945f72784cb8fb3f1c719 Fichier:Wikimembres WMFR 2015-04-20.png 6 118 338 2015-04-20T15:17:49Z Seb35 1 Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. Page originale : https://membres.wikimedia.fr/ wikitext text/x-wiki Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. Page originale : https://membres.wikimedia.fr/ 7e49c1afd0ee7a45c8ba47f46d72c142ba887389 Fichier:OSM-Wiki 2015-04-20.png 6 119 342 2015-04-20T15:21:31Z Seb35 1 Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. Page originale : https://wiki.openstreetmap.org/ wikitext text/x-wiki Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. Page originale : https://wiki.openstreetmap.org/ 4de8dc30637113c4c715c89efb833d8cf0b91197 Fichier:Breizh-Entropy wiki 2015-04-20.png 6 120 343 2015-04-20T15:24:22Z Seb35 1 Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. Page originale : http://wiki.breizh-entropy.org/ wikitext text/x-wiki Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur. Page originale : http://wiki.breizh-entropy.org/ 4574aef5866fcb561264929559276a1f67d99d9f Présentation:Wikis/1/4/2 104 107 344 282 2015-04-20T15:27:05Z Seb35 1 +contenu wikitext text/x-wiki <div style="height:50%; text-align:center;"><div style="width:50%; display:inline-table;">[https://meta.wikimedia.org/ Meta-Wiki]<br />organisation des projets Wikimedia[[Fichier:Meta-Wiki 2015-04-20.png|center|350px]]</div><div style="width:50%; display:inline-table;">[https://membres.wikimedia.fr/ Wiki membres de Wikimédia France]<br />organisation de projets et événements de Wikimédia France[[Fichier:Wikimembres WMFR 2015-04-20.png|center|350px]]</div></div> <div style="height:50%; text-align:center;"><div style="width:50%; display:inline-table;">[http://wiki.openstreetmap.org/ Wiki OpenStreetMap]<br />documentation et événements autour de OpenStreetMap[[Fichier:OSM-Wiki 2015-04-20.png|center|350px]]</div><div style="width:50%; display:inline-table;">[http://wiki.breizh-entropy.org/ Wiki de Breizh-Entropy]<br />coordination du hackerspace Breizh-Entropy[[Fichier:Breizh-Entropy wiki 2015-04-20.png|center|350px]]</div></div> {{Présentation|Autres exemples de wikis : wikis de travail}} dd7d0891d0dc8b7ce086610065c25baf7832230f 346 344 2015-04-20T15:45:08Z Seb35 1 simplification code wikitext text/x-wiki {{Ligne présentation|2|2|css=text-align:center; |[https://meta.wikimedia.org/ Meta-Wiki]<br />organisation des projets Wikimedia[[Fichier:Meta-Wiki 2015-04-20.png|center|350px]] |[https://membres.wikimedia.fr/ Wiki membres de Wikimédia France]<br />organisation de projets et événements de Wikimédia France[[Fichier:Wikimembres WMFR 2015-04-20.png|center|350px]] }} {{Ligne présentation|2|2|css=text-align:center; |[http://wiki.openstreetmap.org/ Wiki OpenStreetMap]<br />documentation et événements autour de OpenStreetMap[[Fichier:OSM-Wiki 2015-04-20.png|center|350px]] |[http://wiki.breizh-entropy.org/ Wiki de Breizh-Entropy]<br />coordination du hackerspace Breizh-Entropy[[Fichier:Breizh-Entropy wiki 2015-04-20.png|center|350px]] }} {{Présentation|Autres exemples de wikis : wikis de travail}} 421fac7fbabfbcede7ce0c764cc31a3300361005 349 346 2015-04-20T15:51:19Z Seb35 1 présentation du wikitexte wikitext text/x-wiki {{Ligne présentation|2|2|css=text-align:center; | [https://meta.wikimedia.org/ Meta-Wiki] <br /> organisation des projets Wikimedia [[Fichier:Meta-Wiki 2015-04-20.png|center|350px]] | [https://membres.wikimedia.fr/ Wiki membres de Wikimédia France] <br /> organisation de projets et événements de Wikimédia France [[Fichier:Wikimembres WMFR 2015-04-20.png|center|350px]] }} {{Ligne présentation|2|2|css=text-align:center; | [http://wiki.openstreetmap.org/ Wiki OpenStreetMap] <br /> documentation et événements autour de OpenStreetMap [[Fichier:OSM-Wiki 2015-04-20.png|center|350px]] | [http://wiki.breizh-entropy.org/ Wiki de Breizh-Entropy] <br /> coordination du hackerspace Breizh-Entropy [[Fichier:Breizh-Entropy wiki 2015-04-20.png|center|350px]] }} {{Présentation|Autres exemples de wikis : wikis de travail}} bd45b48d4fbadd1410f0ef89015cecfeab4342ec Modèle:Ligne présentation 10 121 345 2015-04-20T15:42:20Z Seb35 1 pour simplification des mises en page des présentations wikitext text/x-wiki <div style="height:{{#expr:100/{{{1}}}}}%;{{#if:{{{css|}}}|{{{css}}};}}">{{#ifexpr:{{{2}}}>=1|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{3}}}</div>}}{{#ifexpr:{{{2}}}>=2|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{4}}}</div>}}{{#ifexpr:{{{2}}}>=3|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{5}}}</div>}}{{#ifexpr:{{{2}}}>=4|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{6}}}</div>}}{{#ifexpr:{{{2}}}>=5|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{7}}}</div>}}{{#ifexpr:{{{2}}}>=6|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{8}}}</div>}}{{#ifexpr:{{{2}}}>=7|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{9}}}</div>}}{{#ifexpr:{{{2}}}>=8|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{10}}}</div>}}{{#ifexpr:{{{2}}}>=9|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{11}}}</div>}}{{#ifexpr:{{{2}}}>=10|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{12}}}</div>}}{{#ifexpr:{{{2}}}>=11|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{13}}}</div>}}{{#ifexpr:{{{2}}}>=12|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{14}}}</div>}}{{#ifexpr:{{{2}}}>=13|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{15}}}</div>}}{{#ifexpr:{{{2}}}>=14|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{16}}}</div>}}{{#ifexpr:{{{2}}}>=15|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{17}}}</div>}}{{#ifexpr:{{{2}}}>=16|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{18}}}</div>}}{{#ifexpr:{{{2}}}>=17|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{19}}}</div>}}{{#ifexpr:{{{2}}}>=18|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{20}}}</div>}}{{#ifexpr:{{{2}}}>=19|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{21}}}</div>}}{{#ifexpr:{{{2}}}>=20|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{22}}}</div>}}</div> a7665d94ada38aea2b0c4ac3927a59b2f7e21fe9 347 345 2015-04-20T15:46:16Z Seb35 1 typo wikitext text/x-wiki <div style="height:{{#expr:100/{{{1}}}}}%;{{#if:{{{css|}}}|{{{css}}}}}">{{#ifexpr:{{{2}}}>=1|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{3}}}</div>}}{{#ifexpr:{{{2}}}>=2|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{4}}}</div>}}{{#ifexpr:{{{2}}}>=3|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{5}}}</div>}}{{#ifexpr:{{{2}}}>=4|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{6}}}</div>}}{{#ifexpr:{{{2}}}>=5|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{7}}}</div>}}{{#ifexpr:{{{2}}}>=6|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{8}}}</div>}}{{#ifexpr:{{{2}}}>=7|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{9}}}</div>}}{{#ifexpr:{{{2}}}>=8|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{10}}}</div>}}{{#ifexpr:{{{2}}}>=9|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{11}}}</div>}}{{#ifexpr:{{{2}}}>=10|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{12}}}</div>}}{{#ifexpr:{{{2}}}>=11|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{13}}}</div>}}{{#ifexpr:{{{2}}}>=12|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{14}}}</div>}}{{#ifexpr:{{{2}}}>=13|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{15}}}</div>}}{{#ifexpr:{{{2}}}>=14|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{16}}}</div>}}{{#ifexpr:{{{2}}}>=15|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{17}}}</div>}}{{#ifexpr:{{{2}}}>=16|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{18}}}</div>}}{{#ifexpr:{{{2}}}>=17|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{19}}}</div>}}{{#ifexpr:{{{2}}}>=18|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{20}}}</div>}}{{#ifexpr:{{{2}}}>=19|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{21}}}</div>}}{{#ifexpr:{{{2}}}>=20|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{22}}}</div>}}</div> 22f97511aa9f4b2bcba3a74b5df4a1bcea5977a8 348 347 2015-04-20T15:46:54Z Seb35 1 ça ne sert à rien d’afficher le modèle ici wikitext text/x-wiki <includeonly><div style="height:{{#expr:100/{{{1}}}}}%;{{#if:{{{css|}}}|{{{css}}}}}">{{#ifexpr:{{{2}}}>=1|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{3}}}</div>}}{{#ifexpr:{{{2}}}>=2|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{4}}}</div>}}{{#ifexpr:{{{2}}}>=3|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{5}}}</div>}}{{#ifexpr:{{{2}}}>=4|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{6}}}</div>}}{{#ifexpr:{{{2}}}>=5|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{7}}}</div>}}{{#ifexpr:{{{2}}}>=6|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{8}}}</div>}}{{#ifexpr:{{{2}}}>=7|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{9}}}</div>}}{{#ifexpr:{{{2}}}>=8|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{10}}}</div>}}{{#ifexpr:{{{2}}}>=9|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{11}}}</div>}}{{#ifexpr:{{{2}}}>=10|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{12}}}</div>}}{{#ifexpr:{{{2}}}>=11|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{13}}}</div>}}{{#ifexpr:{{{2}}}>=12|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{14}}}</div>}}{{#ifexpr:{{{2}}}>=13|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{15}}}</div>}}{{#ifexpr:{{{2}}}>=14|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{16}}}</div>}}{{#ifexpr:{{{2}}}>=15|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{17}}}</div>}}{{#ifexpr:{{{2}}}>=16|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{18}}}</div>}}{{#ifexpr:{{{2}}}>=17|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{19}}}</div>}}{{#ifexpr:{{{2}}}>=18|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{20}}}</div>}}{{#ifexpr:{{{2}}}>=19|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{21}}}</div>}}{{#ifexpr:{{{2}}}>=20|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{22}}}</div>}}</div></includeonly> 9eedc450f984d4c484fd461659415918038f12bd 359 348 2015-04-20T19:44:44Z Seb35 1 paramètres par défaut wikitext text/x-wiki <includeonly><div style="height:{{#expr:100/{{{1|1}}}}}%;{{#if:{{{css|}}}|{{{css}}}}}">{{#ifexpr:{{{2|1}}}>=1|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{3|}}}</div>}}{{#ifexpr:{{{2|1}}}>=2|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{4|}}}</div>}}{{#ifexpr:{{{2|1}}}>=3|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{5|}}}</div>}}{{#ifexpr:{{{2|1}}}>=4|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{6|}}}</div>}}{{#ifexpr:{{{2|1}}}>=5|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{7|}}}</div>}}{{#ifexpr:{{{2|1}}}>=6|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{8|}}}</div>}}{{#ifexpr:{{{2|1}}}>=7|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{9|}}}</div>}}{{#ifexpr:{{{2|1}}}>=8|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{10|}}}</div>}}{{#ifexpr:{{{2|1}}}>=9|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{11|}}}</div>}}{{#ifexpr:{{{2|1}}}>=10|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{12|}}}</div>}}{{#ifexpr:{{{2|1}}}>=11|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{13|}}}</div>}}{{#ifexpr:{{{2|1}}}>=12|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{14|}}}</div>}}{{#ifexpr:{{{2|1}}}>=13|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{15|}}}</div>}}{{#ifexpr:{{{2|1}}}>=14|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{16|}}}</div>}}{{#ifexpr:{{{2|1}}}>=15|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{17|}}}</div>}}{{#ifexpr:{{{2|1}}}>=16|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{18|}}}</div>}}{{#ifexpr:{{{2|1}}}>=17|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{19|}}}</div>}}{{#ifexpr:{{{2|1}}}>=18|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{20|}}}</div>}}{{#ifexpr:{{{2|1}}}>=19|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{21|}}}</div>}}{{#ifexpr:{{{2|1}}}>=20|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{22|}}}</div>}}</div></includeonly> 0413783417cf5a726a399346248d0d0c31f059e2 Présentation:Wikis/1/5 104 122 351 2015-04-20T18:38:22Z Seb35 1 ++ wikitext text/x-wiki * [[:frwikipedia:Licence libre|Licences libres]] ** Équation fondamentale : libre ≠ [[:frwikipedia:Freeware|gratuit]] ** Contrats spécifiques accordant des droits à l’utilisateur ** [[:frwikipedia:Licence de libre diffusion|Licences de libre diffusion]] : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Licence Creative Commons#Pas d'utilisation commerciale|CC-*-NC]] et [[:frwikipedia:Licence Creative Commons#Pas de travaux dérivés|CC-*-ND]] ** [[:frwikipedia:Copyleft|Licences ''copyleft'']] : [[:frwikipedia:Creative Commons|Creative Commons]] [https://creativecommons.org/licenses/by-sa/4.0/ CC-BY-SA], [[:frwikipedia:Licence publique générale GNU|GPL]], [[:frwikipedia:Licence Art Libre|Art Libre]] ** Licences non-''copyleft'' : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Creative Commons Attribution|CC-BY]] et [[:frwikipedia:Licence CC0|CC0]], [[:frwikipedia:Licence BSD|BSD]], [[:frwikipedia:Licence publique générale limitée GNU|LGPL]] * Droits connexes rencontrés autour des wikis : [[:frwikipedia:Droits voisins du droit d'auteur en France|droits voisins]], [[:frwikipedia:Droit à l'image|droit à l’image]], [[:frwikipedia:Protection juridique des bases de données|droit des bases de données]] {{Présentation|Questions juridiques}} 8f377bcddc1fdd9f78290dc16702462200f0731a 352 351 2015-04-20T19:08:27Z Seb35 1 ++ wikitext text/x-wiki * [[:frwikipedia:Licence libre|Licences libres]] ** Équation fondamentale : libre ≠ [[:frwikipedia:Freeware|gratuit]] ** Contrats spécifiques accordant des droits à l’utilisateur ** [[:frwikipedia:Licence de libre diffusion|Licences de libre diffusion]] : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Licence Creative Commons#Pas d'utilisation commerciale|CC-*-NC]] et [[:frwikipedia:Licence Creative Commons#Pas de travaux dérivés|CC-*-ND]] ** [[:frwikipedia:Copyleft|Licences ''copyleft'']] : [[:frwikipedia:Creative Commons|Creative Commons]] [https://creativecommons.org/licenses/by-sa/4.0/ CC-BY-SA], [[:frwikipedia:Licence publique générale GNU|GPL]], [[:frwikipedia:Licence Art Libre|Art Libre]] ** Licences non-''copyleft'' : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Creative Commons Attribution|CC-BY]] et [[:frwikipedia:Licence CC0|CC0]], [[:frwikipedia:Licence BSD|BSD]], [[:frwikipedia:Licence publique générale limitée GNU|LGPL]] * Droits connexes rencontrés autour des wikis : [[:frwikipedia:Droits voisins du droit d'auteur en France|droits voisins]], [[:frwikipedia:Droit à l'image|droit à l’image]], [[:frwikipedia:Protection juridique des bases de données|droit des bases de données]] * Questions sous-jacentes aux licences libres : ** Économiques : rémunération des auteurs, [[:frwikipedia:Économie de l'immatériel|économie de l’immatériel]] ** Morales : propriété de l’immatériel, respect ** Philosophiques : [[:frwikipedia:Bien immatériel|biens immatériels]]/[[:frwikipedia:Biens anti-rivaux|biens anti-rivaux]], [[:frwikipedia:Cocréation|co-création]]/[[:frwikipedia:Intelligence collaborative|intelligence collaborative]]/''[[:frwikipedia:Wikinomics|wikinomics]]'' {{Présentation|Questions juridiques}} bab5a8c918a11b9d6b4d88cce7a340d2796f9a03 354 352 2015-04-20T19:24:52Z Seb35 1 ++ wikitext text/x-wiki * [[:frwikipedia:Licence libre|Licences libres]] ** Équation fondamentale : libre ≠ [[:frwikipedia:Freeware|gratuit]] ** Contrats spécifiques accordant des droits à l’utilisateur ** [[:frwikipedia:Licence de libre diffusion|Licences de libre diffusion]] : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Licence Creative Commons#Pas d'utilisation commerciale|CC-*-NC]] et [[:frwikipedia:Licence Creative Commons#Pas de travaux dérivés|CC-*-ND]] ** [[:frwikipedia:Copyleft|Licences ''copyleft'']] : [[:frwikipedia:Creative Commons|Creative Commons]] [https://creativecommons.org/licenses/by-sa/4.0/ CC-BY-SA], [[:frwikipedia:Licence publique générale GNU|GPL]], [[:frwikipedia:Licence Art Libre|Art Libre]] ** Licences non-''copyleft'' : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Creative Commons Attribution|CC-BY]] et [[:frwikipedia:Licence CC0|CC0]], [[:frwikipedia:Licence BSD|BSD]], [[:frwikipedia:Licence publique générale limitée GNU|LGPL]] * Droits connexes rencontrés autour des wikis : [[:frwikipedia:Droits voisins du droit d'auteur en France|droits voisins]], [[:frwikipedia:Droit à l'image|droit à l’image]], [[:frwikipedia:Protection juridique des bases de données|droit des bases de données]], [[:frwikipedia:Vie privée et informatique|vie privée sur l’Internet]] * Questions sous-jacentes aux licences libres : ** Économiques : rémunération des auteurs, [[:frwikipedia:Économie de l'immatériel|économie de l’immatériel]] ** Morales : propriété de l’immatériel, respect ** Philosophiques : [[:frwikipedia:Bien immatériel|biens immatériels]]/[[:frwikipedia:Biens anti-rivaux|biens anti-rivaux]], [[:frwikipedia:Cocréation|co-création]]/[[:frwikipedia:Intelligence collaborative|intelligence collaborative]]/''[[:frwikipedia:Wikinomics|wikinomics]]'' {{Présentation|Questions juridiques}} 642443ee4bed41f6769ef4a38044d12a127c4c47 Module:Présentation 828 104 353 280 2015-04-20T19:19:43Z Seb35 1 certains titres étaient oubliés dans la liste (cas 2e elseif,1er if) wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) return table.getn( sequence ) end function presentation.current( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return i end end return 0 end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end return '' end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i,v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end return '' end function presentation._expandSequence( title ) local list = {}; title = title.rootPageTitle; while true do if title:subPageTitle( '0' ).exists then title = title:subPageTitle( '0' ) elseif title:subPageTitle( '1' ).exists then title = title:subPageTitle( '1' ) elseif tonumber(title.subpageText) ~= nil then if not title.exists then if title.baseText == title.rootText then break end title = title.basePageTitle.basePageTitle:subPageTitle( tostring(tonumber(title.basePageTitle.subpageText)+1) ) else title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ) end else break end if title.exists then list[table.getn(list)+1] = title.fullText end end return list end return presentation 10f9bda926a482f194ebba7134a4ca3bba5d13c0 Présentation:Wikis/2 104 123 356 2015-04-20T19:31:09Z Seb35 1 ++ wikitext text/x-wiki Plan : # Organiser une communauté : théorie et vue d’ensemble # S’adapter à l’environnement local # Coocooning : adapter l’outil à ses besoins propres # Rôles technico-administratifs 493a84f6739c897511e47c2fea6a873fd7a8d437 357 356 2015-04-20T19:32:35Z Seb35 1 +titre et liens wikitext text/x-wiki Plan : # [[Présentation:Wikis/2/1|Organiser une communauté : théorie et vue d’ensemble]] # [[Présentation:Wikis/2/2|S’adapter à l’environnement local]] # [[Présentation:Wikis/2/3|Coocooning : adapter l’outil à ses besoins propres]] # [[Présentation:Wikis/2/4|Rôles technico-administratifs]] {{Présentation|Gérer un wiki MediaWiki}} 4becbcc00b87d0a328147bafefdb8ce467e7feca Présentation:Wikis/2/1 104 124 360 2015-04-21T12:30:22Z Seb35 1 ++ wikitext text/x-wiki * [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-r%C3%B4les Théorie d’Anthere] : plusieurs rôles distincts ** Rôles proposés : créateur-expert, affineur, archiviste, contrôleur-évaluateur, patrouilleur, régulateur-facilitateur, bidouilleur technique, pompier médiateur, agent d’accueil, journaliste ** Possibilité de créer une toile d’araignée d’auto-évaluation dans ces rôles : <tt>http://lab.seb35.fr/participants-wiki.htm</tt> ([http://lab.seb35.fr/participants-wiki.htm#2-2-3-5-1-2-1-1-2-5 exemple]) * Bienveillance et empathie, ticket d’entrée (technique et social) {{Présentation|Organiser une communauté : théorie et vue d’ensemble}} 979182bd2f2f0334e4cee38d538a487ef10d13d7 Présentation:Wikis/2/2 104 125 361 2015-04-21T13:25:03Z Seb35 1 ++ wikitext text/x-wiki * Discussions collectives ** Lieux : pages de discussions, pages par projets/thématiques, lieu central (« Bistro ») * Règles ** Savoir-vivre * Récompenses {{Présentation|S’adapter à l’environnement local}} 4a92cef2415b1afe7c1c15af647edb3a521d513e Présentation:Wikis/2/3 104 126 362 2015-04-21T13:26:40Z Seb35 1 ++ wikitext text/x-wiki * Catégories : organiser et hiérarchiser les pages * Espaces de noms * Modèles : unifier les présentations * Style : personnaliser le style d’un wiki * Extensions : ajouter des fonctionnalités {{Présentation|Coocooning : adapter l’outil à ses besoins propres}} 7410b2377df2410108ccc850701fdf4810cb37c5 Présentation:Wikis/2/4 104 127 363 2015-04-21T13:31:52Z Seb35 1 ++ wikitext text/x-wiki * administrateur : supprimer et bloquer des pages, bloquer des utilisateurs * affiner les rôles : donner plus de possibilité d’actions aux utilisateurs de confiance {{Présentation|Rôles technico-administratifs}} 6875302dcc64a0333d5524b465f813164726eac1 Présentation:Wikis/3 104 128 364 2015-04-21T13:36:50Z Seb35 1 ++ wikitext text/x-wiki # [[Présentation:Wikis/3/1|Les bases de la syntaxe]] # [[Présentation:Wikis/3/2|Les syntaxes avancées]] # [[Présentation:Wikis/3/3|Gérer le vandalisme]] # [[Présentation:Wikis/3/4|Gérer les images et médias]] # [[Présentation:Wikis/3/5|Ressources d’aide]] {{Présentation|Le quotidien en pratique}} b29bf2bd73862ec2c8f77fcdb02ee79489578391 Présentation:Wikis/3/1 104 129 365 2015-04-21T13:38:41Z Seb35 1 ++ wikitext text/x-wiki * Mise en forme : emphase et liens * Catégories * Utilisation de modèles * Utilisation d’images et médias {{Présentation|Les bases de la syntaxe}} 6378857f44a4fdc51f08ccf3464267e863848bd7 406 365 2015-04-21T21:53:11Z Seb35 1 ++ wikitext text/x-wiki * Syntaxe spécifique appelée ''wikitexte'' * Mise en forme : emphase et liens ** <tt><nowiki>''texte en italique''</nowiki></tt> → ''texte en italique'' ** <tt><nowiki>'''texte en gras'''</nowiki></tt> → '''texte en gras'' ** <tt><nowiki>[[Présentation:Wikis|Le texte]]</nowiki></tt> → [[Présentation:Wikis|<span style="color:#0645AD">Le texte</span>]] * Catégories ** <tt><nowiki>[[Catégorie:Nom de la catégorie]]</nowiki></tt> : rien ne s’affiche à cet endroit mais les catégories de l’articles sont affichées en bas de la page (désactivé dans ce mode « présentation ») * Utilisation de modèles ** <tt><nowiki>{{Bleu|texte}}</nowiki></tt> → {{Bleu|texte}} * Utilisation d’images et médias ** <tt><nowiki>[[Fichier:Graphe contributeur wiki Seb35.png|none|Titre affiché lorsque la souris passe sur l’image]]</nowiki></tt> → [[Fichier:Graphe contributeur wiki Seb35.png|none|Titre affiché lorsque la souris passe sur l’image]] ** Les images doivent être préalablement importées sur le wiki (lien « [[Special:Upload|Importer un fichier]] » dans la colonne de gauche lorsqu’on est connecté) {{Présentation|Les bases de la syntaxe}} daa7707e890624227698f6b1e5b0e4ab6c37d4bd 407 406 2015-04-21T21:54:15Z Seb35 1 mise en page wikitext text/x-wiki * Syntaxe spécifique appelée ''wikitexte'' * Mise en forme : emphase et liens ** <tt><nowiki>''texte en italique''</nowiki></tt> → ''texte en italique'' ** <tt><nowiki>'''texte en gras'''</nowiki></tt> → '''texte en gras'' ** <tt><nowiki>[[Présentation:Wikis|Le texte]]</nowiki></tt> → [[Présentation:Wikis|<span style="color:#0645AD">Le texte</span>]] * Catégories ** <tt><nowiki>[[Catégorie:Nom de la catégorie]]</nowiki></tt> : rien ne s’affiche à cet endroit mais les catégories de l’articles sont affichées en bas de la page (désactivé dans ce mode « présentation ») * Utilisation de modèles ** <tt><nowiki>{{Bleu|texte}}</nowiki></tt> → {{Bleu|texte}} * Utilisation d’images et médias ** <tt><nowiki>[[Fichier:Graphe contributeur wiki Seb35.png|none|30px|Titre affiché lorsque la souris passe sur l’image]]</nowiki></tt> → [[Fichier:Graphe contributeur wiki Seb35.png|none|30px|Titre affiché lorsque la souris passe sur l’image]] ** Les images doivent être préalablement importées sur le wiki (lien « [[Special:Upload|Importer un fichier]] » dans la colonne de gauche lorsqu’on est connecté) {{Présentation|Les bases de la syntaxe}} e10d02aca1f2beb03095bbae1d175a2e7107dd7f 412 407 2015-04-21T23:10:26Z Seb35 1 +liens wikitext text/x-wiki * Syntaxe spécifique appelée ''[[:frwikipedia:Wikitexte|wikitexte]]'', de la famille des [[:frwikipedia:Langage de balisage léger|languages de balisage léger]] ([[Syntaxes de formatage léger|comparer]]) * Mise en forme : emphase et liens ** <tt><nowiki>''texte en italique''</nowiki></tt> → ''texte en italique'' ** <tt><nowiki>'''texte en gras'''</nowiki></tt> → '''texte en gras'' ** <tt><nowiki>[[Présentation:Wikis|Le texte]]</nowiki></tt> → [[Présentation:Wikis|<span style="color:#0645AD">Le texte</span>]] * Catégories ** <tt><nowiki>[[Catégorie:Nom de la catégorie]]</nowiki></tt> : rien ne s’affiche à cet endroit mais les catégories de l’articles sont affichées en bas de la page (désactivé dans ce mode « présentation ») * Utilisation de modèles ** <tt><nowiki>{{Bleu|texte}}</nowiki></tt> → {{Bleu|texte}} * Utilisation d’images et médias ** <tt><nowiki>[[Fichier:Graphe contributeur wiki Seb35.png|none|30px|Titre affiché lorsque la souris passe sur l’image]]</nowiki></tt> → [[Fichier:Graphe contributeur wiki Seb35.png|none|30px|Titre affiché lorsque la souris passe sur l’image]] ** Les images doivent être préalablement importées sur le wiki (lien « [[Special:Upload|Importer un fichier]] » dans la colonne de gauche lorsqu’on est connecté) {{Présentation|Les bases de la syntaxe}} 72c1b7f278eabb203017272159e37ff9777f4888 Présentation:Wikis/3/2 104 130 366 2015-04-21T13:39:16Z Seb35 1 ++ wikitext text/x-wiki * Tableaux * Création de modèles {{Présentation|Les syntaxes avancées}} f83f295a488dfacdef538dd2ad8a8ad6de63222a 411 366 2015-04-21T23:05:12Z Seb35 1 ++ wikitext text/x-wiki * Titres : <tt><nowiki>= Titre de niveau 1 =</nowiki></tt> / <tt><nowiki>== Titre de niveau 2 ==</nowiki></tt> / (jusqu’à 6) * Listes : ** Listes à puces : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><tt><nowiki>* Listes :</nowiki><br /><nowiki>** Listes à puces</nowiki><br /><nowiki>*# Listes numérotées</nowiki><br /><nowiki>* Tableaux</nowiki></tt></span> *# Listes numérotées avec des croisillons (<tt>#</tt>) à la place des astérisques (<tt>*</tt>) * Tableaux : [[:mw:Help:Tables|syntaxe spécifique]] * [[:mw:Help:Contents|Quelques autres syntaxes]] moins usitées * Création de modèles : il est possible de créer des modèles ayant de nombreuses fonctionnalités : adaptabilité en fonction des paramètres donnés, logique interne pouvant être complexe, influence de paramètres extérieurs (page, date, configuration du wiki) * Import de modèles d’autres wikis : possible « à la main » (en copiant-collant ; pour des questions de licence il est préférable d’indiquer la page source) ; un jour il devrait y avoir une « banque de modèles » dont on pourrait télécharger et installer des modèles {{Présentation|Les syntaxes avancées}} 7444cc1d0664f2eed57605eec2f3426afcb85ca7 Présentation:Wikis/3/3 104 131 367 2015-04-21T13:39:50Z Seb35 1 ++ wikitext text/x-wiki * Surveiller les modifications récentes * Gérer le spam * Bloquer des contributeurs {{Présentation|Gérer le vandalisme}} ff1a07cdac396d1348aca3dd81ffe0934935703b 410 367 2015-04-21T22:38:42Z Seb35 1 ++ wikitext text/x-wiki * Surveiller les modifications récentes ** Possibilité de recevoir un flux [[:frwikipedia:RSS|RSS]]/[[:frwikipedia:Atom|Atom]] ** La plupart des spammeurs aujourd’hui se créent un compte voire valident l’autorisation envoyée par email ** Révoquer les tests et les fragrants délis, prévenir les contravenents de façon proportionnée (un ou plusieurs avertissements, puis blocage temporaire, puis blocage permanent) ** Idéalement plusieurs contributeurs se relaient (pas forcément de façon formelle) * Gérer le spam ** Bloquer les utilisateurs manifestement spammeurs (pavé de texte en anglais ou russe) ** Une extension, [[:mw:Extension:Nuke|Nuke]], permet de supprimer toutes les contributions d’un utilisateur * Prévenir le spam ** Extension [[:mw:Extension:QuestyCaptcha|QuestyCaptcha]] (poser une question demandant réflexion) ; si brisé, changer les questions ** Retirer le spam pour ne pas encourager les spammeurs ** Faire que la communauté ait les moyens de traiter efficacement le spam {{Présentation|Gérer le vandalisme}} 329c56f78f324ae2c7886f186d6e442c6459a5c9 Présentation:Wikis/3/4 104 132 368 2015-04-21T13:40:20Z Seb35 1 ++ wikitext text/x-wiki * Verser une image ou un média * Questions de licences {{Présentation|Gérer les images et médias}} f21b132469ca607a0036e26352edfd9eb18bda9d 413 368 2015-04-22T05:57:09Z Seb35 1 ++ wikitext text/x-wiki * Verser une image ou un média ** Deux interfaces : [[Special:Upload|standard]] et [[:mw:Extension:UploadWizard|simplifiée]] ** Autres : import transparent d’un autre wiki, versement depuis Internet * Rangement des images ** Possibilité de classer les images par catégories, de façon automatique via des modèles ou manuellement ** Possibilité de créer un [[:commons:Template:Information|modèle standard de description des images]] * Questions de licences ** L’interface de versement peut proposer un [[:commons:MediaWiki:Licenses|choix de licenses]] {{Présentation|Gérer les images et médias}} d599d2f8e38e5fc606f895f79a66770f733a4365 414 413 2015-04-22T05:57:58Z Seb35 1 typo wikitext text/x-wiki * Verser une image ou un média ** Deux interfaces : [[Special:Upload|standard]] et [[:mw:Extension:UploadWizard|améliorée]] ** Autres : import transparent d’un autre wiki, versement depuis Internet * Rangement des images ** Possibilité de classer les images par catégories, de façon automatique via des modèles ou manuellement ** Possibilité de créer un [[:commons:Template:Information|modèle standard de description des images]] * Questions de licences ** L’interface de versement peut proposer un [[:commons:MediaWiki:Licenses|choix de licenses]] {{Présentation|Gérer les images et médias}} 5949c505bebeecfce8abb193e1fdb9c9ad9eed04 Présentation:Wikis/5/1 104 133 369 2015-04-21T13:40:53Z Seb35 1 ++ wikitext text/x-wiki * Verser une image ou un média * Questions de licences {{Présentation|Gérer les images et médias}} f21b132469ca607a0036e26352edfd9eb18bda9d Présentation:Wikis/4 104 134 370 2015-04-21T13:42:13Z Seb35 1 ++ wikitext text/x-wiki # Syntaxe et médias # Licences et philosophie # Faire découvrir l’ensemble des rôles # Présentations collectives {{Présentation|Accompagner des utilisateurs}} 90177ed5d3ea40251c8b644aad7c63d273fa4e45 371 370 2015-04-21T13:43:15Z Seb35 1 ++ wikitext text/x-wiki # [[Présentation:Wikis/5/1|Syntaxe et médias]] # [[Présentation:Wikis/5/2|Licences et philosophie]] # [[Présentation:Wikis/5/3|Faire découvrir l’ensemble des rôles]] # [[Présentation:Wikis/5/4|Présentations collectives]] {{Présentation|Accompagner des utilisateurs}} 2ddac6f9a97e3dcc79c94a6477626334f29bbf59 382 371 2015-04-21T13:54:53Z Seb35 1 numéros wikitext text/x-wiki # [[Présentation:Wikis/4/1|Syntaxe et médias]] # [[Présentation:Wikis/4/2|Licences et philosophie]] # [[Présentation:Wikis/4/3|Faire découvrir l’ensemble des rôles]] # [[Présentation:Wikis/4/4|Présentations collectives]] {{Présentation|Accompagner des utilisateurs}} 1d445faffa9f015414ed003c05a301c3df9d834f 392 382 2015-04-21T18:24:26Z Seb35 1 +modèle présentation plan wikitext text/x-wiki {{Présentation plan| # [[Présentation:Wikis/4/1|Syntaxe et médias]] # [[Présentation:Wikis/4/2|Licences et philosophie]] # [[Présentation:Wikis/4/3|Faire découvrir l’ensemble des rôles]] # [[Présentation:Wikis/4/4|Présentations collectives]] }} {{Présentation|Accompagner des utilisateurs}} e7f1bfe8e46a32feef9862743a74e358ef4da77c Présentation:Wikis/4/2 104 135 372 2015-04-21T13:44:22Z Seb35 1 ++ wikitext text/x-wiki * Faire manipuler la syntaxe * Montrer comment verser un média et comment l’inclure dans une page {{Présentation|Syntaxe et médias}} eeed97f27ee866373cd4572eff306a650373d623 378 372 2015-04-21T13:53:00Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/5/1]] vers [[Présentation:Wikis/4/1]] sans laisser de redirection : erreur de numérotation wikitext text/x-wiki * Faire manipuler la syntaxe * Montrer comment verser un média et comment l’inclure dans une page {{Présentation|Syntaxe et médias}} eeed97f27ee866373cd4572eff306a650373d623 Présentation:Wikis/4/1 104 136 373 2015-04-21T13:44:56Z Seb35 1 ++ wikitext text/x-wiki * Philosophie du partage * Paternité/maternité des œuvres {{Présentation|Licences et philosophie}} b1fba51c81df3d32ccf9c1a3ba640f7143216e01 379 373 2015-04-21T13:53:24Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/5/2]] vers [[Présentation:Wikis/4/2]] sans laisser de redirection : erreur de numérotation wikitext text/x-wiki * Philosophie du partage * Paternité/maternité des œuvres {{Présentation|Licences et philosophie}} b1fba51c81df3d32ccf9c1a3ba640f7143216e01 Présentation:Wikis/4/3 104 137 374 2015-04-21T13:45:25Z Seb35 1 ++ wikitext text/x-wiki * Évoquer les rôles autres que contributeur-expert vers lesquels évoluer {{Présentation|Faire découvrir l’ensemble des rôles}} 624b5265b3e119433af2a473167cdc330cac2497 380 374 2015-04-21T13:54:07Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/5/3]] vers [[Présentation:Wikis/4/3]] sans laisser de redirection : erreur de numérotation wikitext text/x-wiki * Évoquer les rôles autres que contributeur-expert vers lesquels évoluer {{Présentation|Faire découvrir l’ensemble des rôles}} 624b5265b3e119433af2a473167cdc330cac2497 Présentation:Wikis/4/4 104 138 375 2015-04-21T13:45:52Z Seb35 1 ++ wikitext text/x-wiki * Présenter la philosophie des wikis et le rôle de ce wiki spécifique * Montrer quelques articles * Désinhiber de la contribution ** ne pas avoir peur des erreurs, toujours corrigeables ** bienveillance des autres contributeurs, accueil bienveillant ** faire manipuler la syntaxe et la contribution {{Présentation|Présentations collectives}} f4774e18dc0a61536b9cf16a285f3a01a7839923 381 375 2015-04-21T13:54:34Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/5/4]] vers [[Présentation:Wikis/4/4]] sans laisser de redirection : erreur de numérotation wikitext text/x-wiki * Présenter la philosophie des wikis et le rôle de ce wiki spécifique * Montrer quelques articles * Désinhiber de la contribution ** ne pas avoir peur des erreurs, toujours corrigeables ** bienveillance des autres contributeurs, accueil bienveillant ** faire manipuler la syntaxe et la contribution {{Présentation|Présentations collectives}} f4774e18dc0a61536b9cf16a285f3a01a7839923 Présentation:Wikis/5/2 104 139 376 2015-04-21T13:47:41Z Seb35 1 ++ wikitext text/x-wiki Questions ? {{Présentation|Questions libres}} 95aec2b535e268e6c3ac73429b36af36fc07e396 377 376 2015-04-21T13:51:53Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/6]] vers [[Présentation:Wikis/5]] sans laisser de redirection : erreur de numérotation wikitext text/x-wiki Questions ? {{Présentation|Questions libres}} 95aec2b535e268e6c3ac73429b36af36fc07e396 405 377 2015-04-21T21:44:06Z Seb35 1 +crédits wikitext text/x-wiki {{Ligne présentation|4}} {{Ligne présentation|4|1| Questions ? }} {{Ligne présentation|4|1| Crédits : * Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0] * Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image }} {{Présentation|Questions libres}} 3ed1396ca30a65184ce53d9da852ee89ee330d3c 408 405 2015-04-21T21:56:53Z Seb35 1 mise en page wikitext text/x-wiki {{Ligne présentation|4}} {{Ligne présentation|4|1| <span style="margin-left:10em; font-size:4em">Questions ?</span> }} {{Ligne présentation|4}} {{Ligne présentation|4|1| Crédits : * Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0] * Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image }} {{Présentation|Questions libres}} 455a5810e9c62aeaf4f686a46984284b0c5882c5 409 408 2015-04-21T21:59:51Z Seb35 1 wikitext text/x-wiki {{Ligne présentation|4}} {{Ligne présentation|4}} {{Ligne présentation|4}} {{Ligne présentation|4|1| Crédits : * Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0] * Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image }} {{Présentation|Questions ?}} 6e0e30ab9d125ad71dd223f294e1a84d76e905b2 Modèle:Bleu 10 140 383 2015-04-21T17:46:29Z Seb35 1 exemple de modèle (qui servira peut-être d’ailleurs) wikitext text/x-wiki <span style="color:blue">{{{1}}}</span> 1c395e1b6d637e85de095f32c494cf79bde7db8e Présentation:Wikis/2/3 104 126 384 362 2015-04-21T17:54:32Z Seb35 1 ++ wikitext text/x-wiki * Catégories : organiser et hiérarchiser les pages (similaire aux catégories sous Wordpress) ** Exemples de catégories : Lieu > Lieu en France > Parc naturel régional français * Espaces de noms : classer les pages selon leur nature ** Le titre commence par un mot-clé puis deux-points ** Exemples d’espaces de noms : [[:frwikipedia:Special:Allpages/Aide:|Aide]], [[:frwikipedia:Special:Allpages/Modèle:|Modèle]], [[:frwikipedia:Special:Allpages/Utilisateur:|Utilisateur/Utilisatrice]], [[:frwikipedia:Special:Allpages/:|(principal)]], * Modèles : unifier les présentations et simplifier la syntaxe ** Exemple : le modèle « [[Modèle:Bleu|Bleu]] » rend le texte bleu : <tt><nowiki>{{Bleu|texte bleu}}</nowiki></tt> → {{Bleu|texte bleu}} * Style : personnaliser le style d’un wiki ** Language CSS ([[:frwikipedia:Feuilles de style en cascade|Cascading Style Sheets]]) pour modifier en surface un ''skin'' existant ** Création possible de ''[[:mw:Category:All skins|skins]]'' entiers pour modifier entièrement l’apparence * Extensions : ajouter des fonctionnalités ** [[:mw:Statistics about extensions|Environ 700]] [[:mw:Category:Extensions|extensions]] stables {{Présentation|Coocooning : adapter l’outil à ses besoins propres}} 52b06b1db2d281589aa5dda17388335742cf4106 403 384 2015-04-21T21:21:10Z Seb35 1 +exemples de skins wikitext text/x-wiki * Catégories : organiser et hiérarchiser les pages (similaire aux catégories sous Wordpress) ** Exemples de catégories : Lieu > Lieu en France > Parc naturel régional français * Espaces de noms : classer les pages selon leur nature ** Le titre commence par un mot-clé puis deux-points ** Exemples d’espaces de noms : [[:frwikipedia:Special:Allpages/Aide:|Aide]], [[:frwikipedia:Special:Allpages/Modèle:|Modèle]], [[:frwikipedia:Special:Allpages/Utilisateur:|Utilisateur/Utilisatrice]], [[:frwikipedia:Special:Allpages/:|(principal)]], * Modèles : unifier les présentations et simplifier la syntaxe ** Exemple : le modèle « [[Modèle:Bleu|Bleu]] » rend le texte bleu : <tt><nowiki>{{Bleu|texte bleu}}</nowiki></tt> → {{Bleu|texte bleu}} * Style : personnaliser le style d’un wiki ** Language CSS ([[:frwikipedia:Feuilles de style en cascade|Cascading Style Sheets]]) pour modifier en surface un ''skin'' existant * ''[[:mw:Category:All skins|Skins]]'' : pour modifier entièrement l’apparence du wiki ** Exemples : [https://wiki.data.gouv.fr/wiki/Accueil Wiki Etalab], [https://docs.webplatform.org/wiki/Main_Page Web Plateform], [http://www.wiki-brest.net/index.php/Accueil Wiki-Brest] * [[:mw:Category:Extensions|Extensions]] : ajouter des fonctionnalités ** [[:mw:Statistics about extensions|Environ 700]] extensions stables {{Présentation|Coocooning : adapter l’outil à ses besoins propres}} b987f7a2eea9005c4dd791671a81ca6cb9b794a1 404 403 2015-04-21T21:22:05Z Seb35 1 +lien Common.css wikitext text/x-wiki * Catégories : organiser et hiérarchiser les pages (similaire aux catégories sous Wordpress) ** Exemples de catégories : Lieu > Lieu en France > Parc naturel régional français * Espaces de noms : classer les pages selon leur nature ** Le titre commence par un mot-clé puis deux-points ** Exemples d’espaces de noms : [[:frwikipedia:Special:Allpages/Aide:|Aide]], [[:frwikipedia:Special:Allpages/Modèle:|Modèle]], [[:frwikipedia:Special:Allpages/Utilisateur:|Utilisateur/Utilisatrice]], [[:frwikipedia:Special:Allpages/:|(principal)]], * Modèles : unifier les présentations et simplifier la syntaxe ** Exemple : le modèle « [[Modèle:Bleu|Bleu]] » rend le texte bleu : <tt><nowiki>{{Bleu|texte bleu}}</nowiki></tt> → {{Bleu|texte bleu}} * Style : personnaliser le style d’un wiki ** Language CSS ([[:frwikipedia:Feuilles de style en cascade|Cascading Style Sheets]]) pour [[MediaWiki:Common.css|modifier en surface]] un ''skin'' existant * ''[[:mw:Category:All skins|Skins]]'' : pour modifier entièrement l’apparence du wiki ** Exemples : [https://wiki.data.gouv.fr/wiki/Accueil Wiki Etalab], [https://docs.webplatform.org/wiki/Main_Page Web Plateform], [http://www.wiki-brest.net/index.php/Accueil Wiki-Brest] * [[:mw:Category:Extensions|Extensions]] : ajouter des fonctionnalités ** [[:mw:Statistics about extensions|Environ 700]] extensions stables {{Présentation|Coocooning : adapter l’outil à ses besoins propres}} e2495a6c88f98579f1cd3078f7b64a7c56402dec MediaWiki:Common.css 8 4 385 355 2015-04-21T17:57:08Z Seb35 1 +style sur les liens internes css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 .mw-body-content { font-size: 0.975em; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } /* Spécifique à la présentation sur les wikis */ .ns-104 .mw-body .external { background: none; padding-right: 0px; } .ns-104 .mw-body a, .ns-104 .mw-body a:active, .ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active, .ns-104 .mw-body .external, .ns-104 .mw-body .external:active { color: black; text-decoration: none; } .ns-104 .mw-body a:hover, .ns-104 .mw-body a.extiw:hover, .ns-104 .mw-body .external:hover { border-bottom: 1px dotted black; } .ns-104 ul, .ns-104 ol { line-height: 2em; } 7bbcd093a7f6ffaffe1b758518b9653c75092aa8 Fichier:Graphe contributeur wiki Seb35.png 6 141 386 2015-04-21T18:06:40Z Seb35 1 Exemple de graphe « toile d’araignée » de mon (Seb35) profil de contributeur sur les projets wiki – en général – selon la [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-r%C3%B4les théori... wikitext text/x-wiki Exemple de graphe « toile d’araignée » de mon (Seb35) profil de contributeur sur les projets wiki – en général – selon la [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-r%C3%B4les théorie et les profils d’Anthere] et [http://lab.seb35.fr/participants-wiki.htm créé avec un de mes outils] (il est possible de rappeler ce profil [http://lab.seb35.fr/participants-wiki.htm#2-2-3-5-1-2-1-1-2-5 avec ce lien]). Licence WTFPL 2.0. bdb9e710a14af90d62afffbb44b952577f3dcba9 Présentation:Wikis/2/1 104 124 387 360 2015-04-21T18:17:45Z Seb35 1 +image wikitext text/x-wiki [[Fichier:Graphe contributeur wiki Seb35.png|thumb|300px|Exemple de profil de contributeur à un/des projets wiki : [http://lab.seb35.fr/participants-wiki.htm lien vers l’outil].|link=http://lab.seb35.fr/participants-wiki.htm#2-2-3-5-1-2-1-1-2-5]] * [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-r%C3%B4les Théorie d’Anthere] : plusieurs rôles distincts ** Rôles proposés : créateur-expert, affineur, archiviste, contrôleur-évaluateur, patrouilleur, régulateur-facilitateur, bidouilleur technique, pompier médiateur, agent d’accueil, journaliste ** Possibilité de [http://lab.seb35.fr/participants-wiki.htm créer un graphe « toile d’araignée » dans ces rôles] en auto-évaluation voire pour d’autres personnes * Bienveillance et empathie, ticket d’entrée (technique et social) ** Accueil chaleureux des nouveaux et bonne ambiance sociale peuvent contribuer au succès ** De même, simplifier l’usage de l’outil y contribue ** Entre les deux, organiser l’espace/les pages de façon pratique ** Rôle de chacun : auto-organisation et auto-gestion de la communauté elle-même {{Présentation|Organiser une communauté : théorie et vue d’ensemble}} 2c5bfac39441b50ddd507e72a55d8710320fec49 388 387 2015-04-21T18:18:56Z Seb35 1 typo wikitext text/x-wiki [[Fichier:Graphe contributeur wiki Seb35.png|thumb|300px|Exemple de profil de contributeur à un/des projets wiki ([http://lab.seb35.fr/participants-wiki.htm lien vers l’outil]).|link=http://lab.seb35.fr/participants-wiki.htm#2-2-3-5-1-2-1-1-2-5]] * [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-r%C3%B4les Théorie d’Anthere] : plusieurs rôles distincts ** Rôles proposés : créateur-expert, affineur, archiviste, contrôleur-évaluateur, patrouilleur, régulateur-facilitateur, bidouilleur technique, pompier médiateur, agent d’accueil, journaliste ** Possibilité de [http://lab.seb35.fr/participants-wiki.htm créer un graphe « toile d’araignée » dans ces rôles] en auto-évaluation voire pour d’autres personnes * Bienveillance et empathie, ticket d’entrée (technique et social) ** Accueil chaleureux des nouveaux et bonne ambiance sociale peuvent contribuer au succès ** De même, simplifier l’usage de l’outil y contribue ** Entre les deux, organiser l’espace/les pages de façon pratique ** Rôle de chacun : auto-organisation et auto-gestion de la communauté elle-même {{Présentation|Organiser une communauté : théorie et vue d’ensemble}} 4a74530a3cca1b826a19738a214b46e090de1599 Modèle:Présentation plan 10 142 389 2015-04-21T18:22:32Z Seb35 1 modèle d’unification des plans wikitext text/x-wiki <div style="margin:3em auto auto 2em">{{{1}}}</div> c77f1f0f7274a23d5322374c7229363f9cfa120c 394 389 2015-04-21T18:28:07Z Seb35 1 +titre wikitext text/x-wiki <div style="margin:6em auto auto 2em">À venir dans cette section :<div style="margin:1.5em auto auto 1.5em">{{{1}}}</div></div> 224a4a2e81747e83cc394e9c74b9beab55cb24ac 395 394 2015-04-21T18:34:23Z Seb35 1 style wikitext text/x-wiki <div style="margin:10em auto auto 6em; border:6px double blueviolet">À venir dans cette section :<div style="margin:1.5em auto auto 1.5em">{{{1}}}</div></div> 178809f0f0817777be98e0735fb059924f344eda 396 395 2015-04-21T18:34:55Z Seb35 1 style wikitext text/x-wiki <div style="margin:10em auto auto 6em; border-left:6px double blueviolet; padding-left:0.5em">À venir dans cette section :<div style="margin:1.5em auto auto 1.5em">{{{1}}}</div></div> 1d8014c280b9d037881bf69964c3f4de8f31d010 Présentation:Wikis/2 104 123 390 357 2015-04-21T18:23:13Z Seb35 1 +modèle présentation plan wikitext text/x-wiki {{Présentation plan| # [[Présentation:Wikis/2/1|Organiser une communauté : théorie et vue d’ensemble]] # [[Présentation:Wikis/2/2|S’adapter à l’environnement local]] # [[Présentation:Wikis/2/3|Coocooning : adapter l’outil à ses besoins propres]] # [[Présentation:Wikis/2/4|Rôles technico-administratifs]] }} {{Présentation|Gérer un wiki MediaWiki}} e2b8042974d17978fc5e6c975c92354c3d56adeb Présentation:Wikis/3 104 128 391 364 2015-04-21T18:23:58Z Seb35 1 +modèle présentation plan wikitext text/x-wiki {{Présentation plan| # [[Présentation:Wikis/3/1|Les bases de la syntaxe]] # [[Présentation:Wikis/3/2|Les syntaxes avancées]] # [[Présentation:Wikis/3/3|Gérer le vandalisme]] # [[Présentation:Wikis/3/4|Gérer les images et médias]] # [[Présentation:Wikis/3/5|Ressources d’aide]] }} {{Présentation|Le quotidien en pratique}} 3613a9dd7c7dcaa5ba5d1e93007d89d60e952f4e Présentation:Wikis/1 104 99 393 293 2015-04-21T18:25:24Z Seb35 1 +modèle présentation plan wikitext text/x-wiki {{Présentation plan| # [[Présentation:Wikis/1/1|Définition d’un wiki]] # [[Présentation:Wikis/1/2|Historique des wikis]] # [[Présentation:Wikis/1/3|Focus sur la famille de wikis la plus connue : Wikipédia]] # [[Présentation:Wikis/1/4/1|Autres exemples de wikis]] : [[Présentation:Wikis/1/4/1|bases de connaissances thématiques]] et [[Présentation:Wikis/1/4/2|wikis de travail]] # [[Présentation:Wikis/1/5|Questions juridiques]] }} {{Présentation|Présentation et histoire des wikis}} 42fd6c783dee842b828eb8aaaf84725bc435a7b9 Présentation:Wikis/1/2 104 105 397 358 2015-04-21T18:39:14Z Seb35 1 correction wikitext text/x-wiki {{Ligne présentation|3|1| [[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]] 1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|WikiWikiWeb]] par [[:frwikipedia:Ward Cunningham|Ward Cunningham]] * toujours disponible sur <tt>http://c2.com/cgi/wiki</tt> * édition en cliquant sur « Edit » en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice pour cause de spam]) }} {{Ligne présentation|3|1| [[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]] 2001 : lancement de Wikipédia }} {{Ligne présentation|3|1| 2006-2010 : popularisation de Wikipédia et de l’outil }} {{Présentation|Historique des wikis}} 228631a97b7af4005cb708b7af5548e1da1ae04a 398 397 2015-04-21T18:39:25Z Seb35 1 correction wikitext text/x-wiki {{Ligne présentation|3|1| [[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]] 1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|WikiWikiWeb]] par [[:frwikipedia:Ward Cunningham|Ward Cunningham]] * toujours disponible sur <tt>http://c2.com/cgi/wiki</tt> * édition en cliquant sur « EditText » en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice pour cause de spam]) }} {{Ligne présentation|3|1| [[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]] 2001 : lancement de Wikipédia }} {{Ligne présentation|3|1| 2006-2010 : popularisation de Wikipédia et de l’outil }} {{Présentation|Historique des wikis}} 4e598e1b4e1a42d8280d44c29af9c177d689f62e Présentation:Wikis/1/5 104 122 399 354 2015-04-21T18:43:51Z Seb35 1 changement lien wikitext text/x-wiki * [[:frwikipedia:Licence libre|Licences libres]] ** Équation fondamentale : libre ≠ [[:frwikipedia:Freeware|gratuit]] ** Contrats spécifiques accordant des droits à l’utilisateur ** [[:frwikipedia:Licence de libre diffusion|Licences de libre diffusion]] : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Licence Creative Commons#Pas d'utilisation commerciale|CC-*-NC]] et [[:frwikipedia:Licence Creative Commons#Pas de travaux dérivés|CC-*-ND]] ** [[:frwikipedia:Copyleft|Licences ''copyleft'']] : [[:frwikipedia:Creative Commons|Creative Commons]] [https://creativecommons.org/licenses/by-sa/4.0/ CC-BY-SA], [[:frwikipedia:Licence publique générale GNU|GPL]], [[:frwikipedia:Licence Art Libre|Art Libre]] ** Licences non-''copyleft'' : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Creative Commons Attribution|CC-BY]] et [[:frwikipedia:Licence CC0|CC0]], [[:frwikipedia:Licence BSD|BSD]], [[:frwikipedia:Licence publique générale limitée GNU|LGPL]] * Droits connexes rencontrés autour des wikis : [[:frwikipedia:Droits voisins du droit d'auteur en France|droits voisins]], [[:frwikipedia:Droit à l'image|droit à l’image]], [[:frwikipedia:Protection juridique des bases de données|droit des bases de données]], [[:frwikipedia:Vie privée et informatique|vie privée sur l’Internet]] * Questions sous-jacentes aux licences libres : ** Économiques : rémunération des auteurs, [[:frwikipedia:Économie de l'immatériel|économie de l’immatériel]] ** Morales : propriété de l’immatériel, respect ** Philosophiques : [[:frwikipedia:Bien immatériel|biens immatériels]]/[[:frwikipedia:Biens non-rivaux|biens non-rivaux]], [[:frwikipedia:Cocréation|co-création]]/[[:frwikipedia:Intelligence collaborative|intelligence collaborative]]/''[[:frwikipedia:Wikinomics|wikinomics]]'' {{Présentation|Questions juridiques}} ba554529fd832d9d0100f0a2e7aef8b302ad78e2 Fichier:Groupes utilisateur MediaWiki.svg 6 143 400 2015-04-21T20:43:13Z Seb35 1 * Auteur : Seb35 * Licence : WTFPL 2.0 wikitext text/x-wiki * Auteur : Seb35 * Licence : WTFPL 2.0 ccb61d38d3160e532fe090800b9346d79bdc4bf7 Présentation:Wikis/2/4 104 127 401 363 2015-04-21T20:51:54Z Seb35 1 ++ wikitext text/x-wiki [[Fichier:Groupes utilisateur MediaWiki.svg|thumb|300px|Droits accordés aux groupes d’utilisateurs.]] * Permissions : plusieurs [[Special:Listgrouprights|''droits [d’effectuer des actions]'']] sont disponibles ; chaque ''groupe d’utilisateurs'' dispose d’un certain nombre d’entre eux. Classiquement : ** utilisateurs enregistrés : ont plus de droits que les utilisateurs non-enregistrés ** administrateurs : peuvent supprimer, restaurer et bloquer des pages, bloquer des utilisateurs ** bureaucrates : peuvent modifier les droits des utilisateurs, notamment les droits d’administrateur * donner plus de possibilité d’actions aux utilisateurs de confiance : valorisation, moins d’obstacles au quotidien ** par exemple : retrait de vérifications anti-spam, outils pour combattre le vandalisme : ''rollback'', suppression, blocage {{Présentation|Rôles technico-administratifs}} 225c537135e7cd13522bdbc1f508aa2c2bbc83aa Présentation:Wikis/2/2 104 125 402 361 2015-04-21T21:12:02Z Seb35 1 ++ wikitext text/x-wiki * Règles ** Savoir-vivre / [[:frwikipedia:Nétiquette|nétiquette]] : pour éviter que les contributeurs aient une mauvaise expérience ** Périmètre du wiki : énoncer clairement les contenus admissibles (thème/domaine, style de rédaction, etc.) ** Conventions : typographie, règles de mise en page ** Gouvernance : quelle est-elle ? comment s’organise-t-elle ? * Discussions collectives ** Lieux : pages de discussions, pages par projets/thématiques, lieu central (« Bistro ») * Récompenses : recevoir des récompenses pour le travail effectué sur un wiki fait ''en général'' plaisir * Organisation pratique : ** Comment signaler un vandalisme important en cours ? ** Comment demander à supprimer une page ? ** Projets de maintenance : *** de nombreuses [[Special:Specialpages#mw-specialpagesgroup-maintenance|pages spéciales]] indiquent des problèmes sur certaines pages *** utilisation de bandeaux et/ou catégories pour signaler des problèmes {{Présentation|S’adapter à l’environnement local}} b984cc5f6f6878e4073e54a82b1a5a9e15cf30ea Présentation:Wikis/5/1 104 133 415 369 2015-04-22T06:09:09Z Seb35 1 ++ wikitext text/x-wiki * [[:mw:|MediaWiki.org]] : [[:mw:Help:Contents/fr|aide utilisateur]], [[:mw:Manual:Contents|manuel technique]] * La Wikipédia en français contient des [[:frwikipedia:Aide:Sommaire détaillé|ressources d’aide]] s’appliquant à tous les wikis (syntaxe, utilisation du logiciel) et peut servir d’exemple pour créer des règles locales * [https://intern.wikimedia.ch/lists/listinfo/mediawiki-fr Liste de discussion mediawiki-fr]] {{Présentation|Ressources d’aide}} 3285944c31ea9037cf79644f9a2403c1cddd22c9 416 415 2015-04-22T06:09:54Z Seb35 1 typo wikitext text/x-wiki * [[:mw:|MediaWiki.org]] : [[:mw:Help:Contents/fr|aide utilisateur]], [[:mw:Manual:Contents|manuel technique]] * La Wikipédia en français contient des [[:frwikipedia:Aide:Sommaire détaillé|ressources d’aide]] s’appliquant à tous les wikis (syntaxe, utilisation du logiciel) et peut servir d’exemple pour créer des règles locales * [https://intern.wikimedia.ch/lists/listinfo/mediawiki-fr Liste de discussion mediawiki-fr]] {{Présentation|Ressources d’aide}} 215fa5b0d5583a99bd6bdf72d41dd8c1725585d7 418 416 2015-04-22T06:12:33Z Seb35 1 syntaxe wikitext text/x-wiki * [[:mw:|MediaWiki.org]] : [[:mw:Help:Contents/fr|aide utilisateur]], [[:mw:Manual:Contents|manuel technique]] * La Wikipédia en français contient des [[:frwikipedia:Aide:Sommaire détaillé|ressources d’aide]] s’appliquant à tous les wikis (syntaxe, utilisation du logiciel) et peut servir d’exemple pour créer des règles locales * [https://intern.wikimedia.ch/lists/listinfo/mediawiki-fr Liste de discussion mediawiki-fr] {{Présentation|Ressources d’aide}} 24eae61f87811383b68eb3c19caa17028e900b95 442 418 2015-04-23T15:51:36Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/3/5]] vers [[Présentation:Wikis/5/1]] sans laisser de redirection : plus logique de mettre les ressources à la fin wikitext text/x-wiki * [[:mw:|MediaWiki.org]] : [[:mw:Help:Contents/fr|aide utilisateur]], [[:mw:Manual:Contents|manuel technique]] * La Wikipédia en français contient des [[:frwikipedia:Aide:Sommaire détaillé|ressources d’aide]] s’appliquant à tous les wikis (syntaxe, utilisation du logiciel) et peut servir d’exemple pour créer des règles locales * [https://intern.wikimedia.ch/lists/listinfo/mediawiki-fr Liste de discussion mediawiki-fr] {{Présentation|Ressources d’aide}} 24eae61f87811383b68eb3c19caa17028e900b95 446 442 2015-04-23T16:00:06Z Seb35 1 +liste wikis territoriaux wikitext text/x-wiki * [[:mw:|MediaWiki.org]] : [[:mw:Help:Contents/fr|aide utilisateur]], [[:mw:Manual:Contents|manuel technique]] * La Wikipédia en français contient des [[:frwikipedia:Aide:Sommaire détaillé|ressources d’aide]] s’appliquant à tous les wikis (syntaxe, utilisation du logiciel) et peut servir d’exemple pour créer des règles locales * [https://intern.wikimedia.ch/lists/listinfo/mediawiki-fr Liste de discussion sur MediaWiki (en français)] * [http://listes.infini.fr/wws/info/wikis-territoriaux Liste de discussion sur les wikis territoriaux] {{Présentation|Ressources d’aide}} a73f2aa25a9f6ce2ffd502aeaecd33caea124508 Présentation:Wikis/4/1 104 136 417 379 2015-04-22T06:11:06Z Seb35 1 ++ wikitext text/x-wiki * Philosophie du partage : discussion et explication nécessaires * Paternité des œuvres et respect des œuvres créées {{Présentation|Licences et philosophie}} 5489b9fcf5b7e23c446a4511c490e19f972687fc 423 417 2015-04-23T11:15:28Z Seb35 1 ++ wikitext text/x-wiki * Philosophie du partage : ** Introduire l’outil wiki : tout le monde peut contribuer et l’enrichir [affirmation positive] ** Aux sceptiques : Wikipédia fonctionne depuis 10 ans sans problème majeur ** Aux critiques « droit d’auteur, ça m’appartient » : c’est toujours le cas + le but de collaborer sur un wiki est de partager et enrichir… ** Aux critiques « droit d’auteur, je veux être payé » : la non-commercialisation serait un problème majeur à la dissémination ** Aux critiques « droit d’auteur, ''on'' va dénaturer mon texte » : le droit moral en France est inaliénable + relativiser {{Présentation|Licences et philosophie}} 02acc15d8888f0231bc8c6fd46d0326ef2e560f3 427 423 2015-04-23T11:17:49Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/4/2]] vers [[Présentation:Wikis/4/1]] sans laisser de redirection : échange wikitext text/x-wiki * Philosophie du partage : ** Introduire l’outil wiki : tout le monde peut contribuer et l’enrichir [affirmation positive] ** Aux sceptiques : Wikipédia fonctionne depuis 10 ans sans problème majeur ** Aux critiques « droit d’auteur, ça m’appartient » : c’est toujours le cas + le but de collaborer sur un wiki est de partager et enrichir… ** Aux critiques « droit d’auteur, je veux être payé » : la non-commercialisation serait un problème majeur à la dissémination ** Aux critiques « droit d’auteur, ''on'' va dénaturer mon texte » : le droit moral en France est inaliénable + relativiser {{Présentation|Licences et philosophie}} 02acc15d8888f0231bc8c6fd46d0326ef2e560f3 429 427 2015-04-23T11:26:10Z Seb35 1 ++ wikitext text/x-wiki * Philosophie du partage : ** Introduire l’outil wiki : tout le monde peut contribuer et l’enrichir [affirmation positive] ** Aux sceptiques : Wikipédia fonctionne depuis 10 ans sans problème majeur ** Aux critiques « droit d’auteur, ça m’appartient » : c’est toujours le cas + le but de collaborer sur un wiki est de partager et enrichir… ** Aux critiques « droit d’auteur, je veux être payé » : la non-commercialisation serait un problème majeur à la dissémination ** Aux critiques « droit d’auteur, ''on'' va dénaturer mon texte » : le droit moral en France est inaliénable + relativiser * Présenter l’objet du wiki et ses règles de base ** Mode « dialogue » préférable si possible, plus proche de la philosophie wiki {{Présentation|Licences et philosophie}} e92bcf4d6da685a98dc71f30b3b904b60f6aac8f Présentation:Wikis 104 98 419 208 2015-04-22T07:07:30Z Seb35 1 ++ wikitext text/x-wiki <div style="margin:5em auto 4em 3em">''Les wikis, objets de collecte et dissémination de savoirs''</div> Plan de la présentation # [[Présentation:Wikis/1|Présentation et histoire des wikis]] # [[Présentation:Wikis/2|Gérer un wiki MediaWiki]] # [[Présentation:Wikis/3|Le quotidien en pratique]] # [[Présentation:Wikis/4|Accompagner des utilisateurs]] 934aff36c2d368a26090aa27be6e6c58eb173db2 420 419 2015-04-22T07:08:46Z Seb35 1 + wikitext text/x-wiki <div style="margin:5em auto 4em 3em">''Les wikis, objets de collecte et dissémination de savoirs''</div> <div style="margin-left:1em">Plan de la présentation # [[Présentation:Wikis/1|Présentation et histoire des wikis]] # [[Présentation:Wikis/2|Gérer un wiki MediaWiki]] # [[Présentation:Wikis/3|Le quotidien en pratique]] # [[Présentation:Wikis/4|Accompagner des utilisateurs]]</div> {{Présentation|Wikis}} bda7ffeeccce8d8715d029c3a937e9b48f5b3090 421 420 2015-04-22T07:12:00Z Seb35 1 +image wikitext text/x-wiki [[Fichier:HNL Wiki Wiki Bus.jpg|right|400px|[[:enwikipedia:Wiki Wiki Shuttle|Wiki Wiki Shuttle]]]] <div style="margin:5em auto 4em 3em">''Les wikis, objets de collecte et dissémination de savoirs''</div> <div style="margin-left:1em">Plan de la présentation # [[Présentation:Wikis/1|Présentation et histoire des wikis]] # [[Présentation:Wikis/2|Gérer un wiki MediaWiki]] # [[Présentation:Wikis/3|Le quotidien en pratique]] # [[Présentation:Wikis/4|Accompagner des utilisateurs]]</div> {{Présentation|Wikis}} 30e6b9cd93beb78752ec7cdfe568e3b5b6a841c8 439 421 2015-04-23T15:18:40Z Seb35 1 unification style, +1 wikitext text/x-wiki [[Fichier:HNL Wiki Wiki Bus.jpg|right|400px|[[:enwikipedia:Wiki Wiki Shuttle|Wiki Wiki Shuttle]]]] <div style="margin:5em auto auto 3em">''Les wikis, objets de collecte et dissémination de savoirs''</div> {{Présentation plan|texte=Plan de la présentation :| # [[Présentation:Wikis/1|Présentation et histoire des wikis]] # [[Présentation:Wikis/2|Gérer un wiki MediaWiki]] # [[Présentation:Wikis/3|Le quotidien en pratique]] # [[Présentation:Wikis/4|Accompagner des utilisateurs]] # [[Présentation:Wikis/5|Coda : références & crédits]] }} {{Présentation|Wikis}} 61d4a4e045aa5b04f9b503311c35d16249d6eb93 444 439 2015-04-23T15:53:15Z Seb35 1 lien wikitext text/x-wiki [[Fichier:HNL Wiki Wiki Bus.jpg|right|400px|[[:enwikipedia:Wiki Wiki Shuttle|Wiki Wiki Shuttle]]]] <div style="margin:5em auto auto 3em">''Les wikis, objets de collecte et dissémination de savoirs''</div> {{Présentation plan|texte=Plan de la présentation :| # [[Présentation:Wikis/1|Présentation et histoire des wikis]] # [[Présentation:Wikis/2|Gérer un wiki MediaWiki]] # [[Présentation:Wikis/3|Le quotidien en pratique]] # [[Présentation:Wikis/4|Accompagner des utilisateurs]] # [[Présentation:Wikis/5/1|Coda : références & crédits]] }} {{Présentation|Wikis}} e8be87161b72497c8105842d11c4447fed84af8b Présentation:Wikis/3/3 104 131 422 410 2015-04-22T14:19:38Z Seb35 1 ortho wikitext text/x-wiki * Surveiller les modifications récentes ** Possibilité de recevoir un flux [[:frwikipedia:RSS|RSS]]/[[:frwikipedia:Atom|Atom]] ** La plupart des spammeurs aujourd’hui se créent un compte voire valident l’autorisation envoyée par email ** Révoquer les tests et les fragrants délits, prévenir les contrevenants de façon proportionnée (un ou plusieurs avertissements, puis blocage temporaire, puis blocage permanent) ** Idéalement plusieurs contributeurs se relaient (pas forcément de façon formelle) * Gérer le spam ** Bloquer les utilisateurs manifestement spammeurs (pavé de texte en anglais ou russe) ** Une extension, [[:mw:Extension:Nuke|Nuke]], permet de supprimer toutes les contributions d’un utilisateur * Prévenir le spam ** Extension [[:mw:Extension:QuestyCaptcha|QuestyCaptcha]] (poser une question demandant réflexion) ; si brisé, changer les questions ** Retirer le spam pour ne pas encourager les spammeurs ** Faire que la communauté ait les moyens de traiter efficacement le spam {{Présentation|Gérer le vandalisme}} df04c4e50656f32f4c04f04fd3b366797dcc6ce2 Présentation:Wikis/4/2 104 135 424 378 2015-04-23T11:16:00Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/4/1]] vers [[Présentation:Wikis/4/2bis]] sans laisser de redirection : échange wikitext text/x-wiki * Faire manipuler la syntaxe * Montrer comment verser un média et comment l’inclure dans une page {{Présentation|Syntaxe et médias}} eeed97f27ee866373cd4572eff306a650373d623 428 424 2015-04-23T11:18:19Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/4/2bis]] vers [[Présentation:Wikis/4/2]] sans laisser de redirection : échange wikitext text/x-wiki * Faire manipuler la syntaxe * Montrer comment verser un média et comment l’inclure dans une page {{Présentation|Syntaxe et médias}} eeed97f27ee866373cd4572eff306a650373d623 430 428 2015-04-23T11:28:14Z Seb35 1 ++ wikitext text/x-wiki * Faire l’interface en tant que contributeur → appropriation de l’outil et de la philosophie * Idéalement faire manipuler la syntaxe de base * Rassurer sur le fait de faire des erreurs * Chercher un sujet d’intérêt du contributeur-apprenti (aisance sur le domaine à défaut de l’outil) * Montrer comment verser un média et comment l’inclure dans une page {{Présentation|Syntaxe et médias}} a4fe7581a6c07e8ac14e483289a97e878c29e2d9 431 430 2015-04-23T11:32:02Z Seb35 1 typo wikitext text/x-wiki * Faire manipuler l’interface en tant que contributeur → appropriation de l’outil et de la philosophie * Idéalement faire manipuler la syntaxe de base * Rassurer sur le fait de faire des erreurs * Chercher un sujet d’intérêt du contributeur-apprenti (aisance sur le domaine à défaut de l’outil) * Montrer comment verser un média et comment l’inclure dans une page {{Présentation|Syntaxe et médias}} dba723775662b6e924829bd29e159426dc7da368 433 431 2015-04-23T11:34:20Z Seb35 1 +1 wikitext text/x-wiki * Faire manipuler l’interface en tant que contributeur → appropriation de l’outil et de la philosophie * Idéalement faire manipuler la syntaxe de base * Rassurer sur le fait de faire des erreurs * Chercher un sujet d’intérêt du contributeur-apprenti (aisance sur le domaine à défaut de l’outil) * Éviter de faire soi-même, laisser la main au contributeur-apprenti * Montrer comment verser un média et comment l’inclure dans une page {{Présentation|Syntaxe et médias}} eb30dd351126c3198681998edbe00d8b1ee27ec8 436 433 2015-04-23T11:40:38Z Seb35 1 changement du titre, +1 wikitext text/x-wiki * Faire créer un compte ; expliquer les avantages (stabilité du nom, outils supplémentaires) * Faire manipuler l’interface en tant que contributeur → appropriation de l’outil et de la philosophie * Idéalement faire manipuler la syntaxe de base * Rassurer sur le fait de faire des erreurs * Chercher un sujet d’intérêt du contributeur-apprenti (aisance sur le domaine à défaut de l’outil) * Éviter de faire soi-même, laisser la main au contributeur-apprenti * Montrer comment verser un média et comment l’inclure dans une page {{Présentation|Interface et syntaxe}} 1e7ca95a66a6faa4d2d1b6ec8034b401b950e4fc Présentation:Wikis/4 104 134 425 392 2015-04-23T11:16:37Z Seb35 1 échange wikitext text/x-wiki {{Présentation plan| # [[Présentation:Wikis/4/1|Licences et philosophie]] # [[Présentation:Wikis/4/2|Syntaxe et médias]] # [[Présentation:Wikis/4/3|Faire découvrir l’ensemble des rôles]] # [[Présentation:Wikis/4/4|Présentations collectives]] }} {{Présentation|Accompagner des utilisateurs}} 3e8c0fbf8b4decc8925df21e95646d7abb14772f 432 425 2015-04-23T11:33:33Z Seb35 1 changement titre wikitext text/x-wiki {{Présentation plan| # [[Présentation:Wikis/4/1|Licences et philosophie]] # [[Présentation:Wikis/4/2|Syntaxe et médias]] # [[Présentation:Wikis/4/3|De la communauté]] # [[Présentation:Wikis/4/4|Présentations collectives]] }} {{Présentation|Accompagner des utilisateurs}} 8c559fd4b1f613488f030dd7246f85309047c957 435 432 2015-04-23T11:40:13Z Seb35 1 changement de nom wikitext text/x-wiki {{Présentation plan| # [[Présentation:Wikis/4/1|Licences et philosophie]] # [[Présentation:Wikis/4/2|Interface et syntaxe]] # [[Présentation:Wikis/4/3|De la communauté]] # [[Présentation:Wikis/4/4|Présentations collectives]] }} {{Présentation|Accompagner des utilisateurs}} 1d013979da98ec5839e209767ce26fd6eb7dc8f8 Présentation:Wikis/4/4 104 138 434 381 2015-04-23T11:38:22Z Seb35 1 +1 wikitext text/x-wiki * Présenter la philosophie des wikis et le rôle de ce wiki spécifique * Montrer quelques articles * Désinhiber de la contribution – atelier individuel ou en très petits groupes ** ne pas avoir peur des erreurs, toujours corrigeables ** bienveillance des autres contributeurs, accueil bienveillant ** faire manipuler la syntaxe et la contribution * Durée : 1 heure est un peu court ; 1h15 ou 1h30 conseillé {{Présentation|Présentations collectives}} 52b85946c75d842a3050b032119de9cb68f0805f Présentation:Wikis/4/3 104 137 437 380 2015-04-23T11:40:58Z Seb35 1 ++ wikitext text/x-wiki * Parler de l’aspect communautaire du wiki * Parler des éventuelles rencontres physiques * Évoquer les rôles autres que contributeur-expert vers lesquels évoluer * Montrer les [[Special:Recentchanges|modifications récentes]], bistros et autres lieux d’échange {{Présentation|De la communauté}} b24a6bad07a2c190c88cdf7dfb43301e104a62d5 Modèle:Présentation plan 10 142 438 396 2015-04-23T15:14:39Z Seb35 1 +texte personnalisable wikitext text/x-wiki <div style="margin:10em auto auto 6em; border-left:6px double blueviolet; padding-left:0.5em">{{{texte|À venir dans cette section :}}}<div style="margin:1.5em auto auto 1.5em">{{{1}}}</div></div> 1b5e0e6d35c0788e5da35adc0e942d675726d374 Présentation:Wikis/3 104 128 440 391 2015-04-23T15:43:47Z Seb35 1 -1 wikitext text/x-wiki {{Présentation plan| # [[Présentation:Wikis/3/1|Les bases de la syntaxe]] # [[Présentation:Wikis/3/2|Les syntaxes avancées]] # [[Présentation:Wikis/3/3|Gérer le vandalisme]] # [[Présentation:Wikis/3/4|Gérer les images et médias]] }} {{Présentation|Le quotidien en pratique}} 41d33cf0f8cb088490680b5934574e987d791569 Présentation:Wikis/5/2 104 139 441 409 2015-04-23T15:50:52Z Seb35 1 Seb35 a déplacé la page [[Présentation:Wikis/5]] vers [[Présentation:Wikis/5/2]] sans laisser de redirection : rationalisation wikitext text/x-wiki {{Ligne présentation|4}} {{Ligne présentation|4}} {{Ligne présentation|4}} {{Ligne présentation|4|1| Crédits : * Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0] * Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image }} {{Présentation|Questions ?}} 6e0e30ab9d125ad71dd223f294e1a84d76e905b2 443 441 2015-04-23T15:52:59Z Seb35 1 changement wikitext text/x-wiki {{Ligne présentation|4}} {{Ligne présentation|4}} {{Ligne présentation|4}} {{Ligne présentation|4|1| * Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0] * Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image }} {{Présentation|Crédits}} 51b635c933ead4ebc0f6e2fad410585fba1cdcc4 445 443 2015-04-23T15:56:42Z Seb35 1 mise en page wikitext text/x-wiki {{Ligne présentation|3}} {{Ligne présentation|3}} {{Ligne présentation|3|1| * Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0] * Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image }} {{Présentation|Crédits}} 57738429eba2b5502871e7155302a909852beb5b 447 445 2015-04-23T16:06:43Z Seb35 1 +mise en page wikitext text/x-wiki {{Ligne présentation|2}} {{Ligne présentation|2|1| * Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0] * Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image * Mise en page : l’espace de noms Présentation: est présenté ainsi par [https://www.seb35.fr/ Seb35] ; c’est en test et deviendra peut-être une extension MediaWiki à part entière }} {{Présentation|Crédits}} 43b98c76b196884dae9439ca43ea2e3ab3cf1562 448 447 2015-04-23T16:10:39Z Seb35 1 +date wikitext text/x-wiki {{Ligne présentation|2}} {{Ligne présentation|2|1| * Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0] * Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image * Mise en page : l’espace de noms Présentation: est présenté ainsi par [https://www.seb35.fr/ Seb35] ; c’est en test (avril 2015) et deviendra peut-être une extension MediaWiki à part entière }} {{Présentation|Crédits}} a1f3ab6bd4673b596febcb0d22051f316fcf467c Module:Présentation 828 104 449 353 2015-04-23T16:46:34Z Seb35 1 +lien pour page 0 wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) return table.getn( sequence ) end function presentation.current( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i, v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return i end end return 0 end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i, v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end if not mw.title.getCurrentTitle().isSubpage then return 0 end return '' end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i, v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end return '' end function presentation._expandSequence( title ) local list = {}; title = title.rootPageTitle; while true do if title:subPageTitle( '0' ).exists then title = title:subPageTitle( '0' ) elseif title:subPageTitle( '1' ).exists then title = title:subPageTitle( '1' ) elseif tonumber(title.subpageText) ~= nil then if not title.exists then if title.baseText == title.rootText then break end title = title.basePageTitle.basePageTitle:subPageTitle( tostring(tonumber(title.basePageTitle.subpageText)+1) ) else title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ) end else break end if title.exists then list[table.getn(list)+1] = title.fullText end end return list end return presentation 44377ec994d25f0a27c16862f30dc6974fc927b1 450 449 2015-04-23T16:48:49Z Seb35 1 cht’i bug wikitext text/x-wiki --[[ ]] local presentation = {} function presentation.total( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) return table.getn( sequence ) end function presentation.current( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i, v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return i end end return 0 end function presentation.next( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i, v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i+1] end end if not mw.title.getCurrentTitle().isSubpage then return sequence[1] end return '' end function presentation.previous( frame ) local sequence = presentation._expandSequence( mw.title.getCurrentTitle() ) for i, v in pairs( sequence ) do if v == mw.title.getCurrentTitle().fullText then return sequence[i-1] end end return '' end function presentation._expandSequence( title ) local list = {}; title = title.rootPageTitle; while true do if title:subPageTitle( '0' ).exists then title = title:subPageTitle( '0' ) elseif title:subPageTitle( '1' ).exists then title = title:subPageTitle( '1' ) elseif tonumber(title.subpageText) ~= nil then if not title.exists then if title.baseText == title.rootText then break end title = title.basePageTitle.basePageTitle:subPageTitle( tostring(tonumber(title.basePageTitle.subpageText)+1) ) else title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ) end else break end if title.exists then list[table.getn(list)+1] = title.fullText end end return list end return presentation 63afab35de10fa2e67568a9c090356f3ab4efc5f MediaWiki:Common.css 8 4 451 385 2015-04-23T16:51:06Z Seb35 1 visibilité des liens css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 .mw-body-content { font-size: 0.975em; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } /* Spécifique à la présentation sur les wikis */ .ns-104 .mw-body .external { background: none; padding-right: 0px; } .ns-104 .mw-body a, .ns-104 .mw-body a:active, .ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active, .ns-104 .mw-body .external, .ns-104 .mw-body .external:active { color: black; border-bottom: 1px dotted black; } .ns-104 .mw-body a:hover, .ns-104 .mw-body a.extiw:hover, .ns-104 .mw-body .external:hover { border-bottom: 1px dotted black; } .ns-104 ul, .ns-104 ol { line-height: 2em; } c142b815edb19c61184f6f4f741b98d389b783c0 Accueil 0 1 452 136 2015-04-25T09:31:55Z Seb35 1 /* Autres */ +lien [[Présentation:Wikis]] wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. == Pages du wiki == === Tutoriaux === {{Special:Allpages/Tutorial:}} === Autres === * [[Présentation:Wikis]] * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] 9f801d3e323f2a9bbf5b9fb3c962eb4d3172d2b8 453 452 2015-06-15T09:25:35Z Seb35 1 liens statiques wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. == Pages du wiki == === Tutoriaux === * [[Tutorial:Beautiful MediaWiki URLs]] * [[Tutorial:Packaging de WebApps]] === Autres === * [[Présentation:Wikis]] * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] 97aee9da040a03ccf7a04b678ab0c81dc883dac2 457 453 2015-09-08T16:05:11Z Seb35 1 +page sur les CRM wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. == Pages du wiki == === Tutoriaux === * [[Tutorial:Beautiful MediaWiki URLs]] * [[Tutorial:Packaging de WebApps]] === Autres === * [[Présentation:Wikis]] * [[CRM]] (comparaison de CRMs libres) * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] 446d228889f8db94f25b3717b08b3b8cc941efca CRM 0 146 456 2015-09-08T16:04:14Z Seb35 1 page récapitulative des CRMs testés récemment wikitext text/x-wiki Les '''CRM''' (Customer/Client Relationship Manager) ou '''GRC''' en français (gestion de la gelation client) permettent à une entreprise de consigner les différentes interactions qu’elle a avec un client donné. Les fonctionnalités varient beaucoup d’un logiciel à l’autre, et la délimitation peut parfois être fine entre les CRM et les ERP (Enterprise Ressource Planning, en français PGI/progiciel de gestion intégré), ces derniers étant globalement plus orientés vers la gestion backend de l’entreprise. Cette page se concentre sur les CRM libres : * CiviCRM, orienté associations d’une certaine taille et/ou dispersée géographiquement * SugarCRM, très orienté pour les commerciaux (logiciel limite libre) * SuiteCRM, fork récent de SugarCRM * vtiger CRM, fork plus ancien de SugarCRM * CremeCRM * Dolibarr * Odoo (anciennement OpenERP) * Galette, orienté petites associations pour la gestion d’adhérents == SugarCRM Community Edition == * Site : https://www.sugarcrm.com/ * Licence : AGPLv3 + conditions spécifiques non-libres à accepter y compris pour une installation locale (non-distribution des forks, sous-licenciement des données utilisateur, etc. = bizarre pour une installation locale, ça pourrait être justifié pour une installation hébergée/SaaS), nombreuses critiques sur le caractères (encore) libre de SugarCRM * Modèle économique : open-core, support pour éditions payantes, version libre et gratuite maintenue au minimum * Téléchargement : [http://sourceforge.net/projects/sugarcrm/files/ tarball sur SourceForge], pas de dépôt de gestion de version public ? * Avis : très orienté commercial : contacts clients, prospects, email en masse, ROI, appels programmés * Difficulté d’installation : relativement simple * Difficulté de configuration : très peu de configuration initiale * Difficulté de prise en main utilisateur : ''(non-suffisamment-testé-pour-avoir-un-avis)'' == SuiteCRM == * Site : https://suitecrm.com/ * Licence : AGPLv3 * Modèle économique : libre développé par une entreprise et une petite communauté, services et support payants, installation hébergée (SaaS) proposée * Téléchargement : [https://suitecrm.com/download tarball], [https://github.com/salesagility/SuiteCRM dépôt Git] * Avis : (similaire à SugarCRM) très orienté commercial : contacts clients, prospects, email en masse, ROI, appels programmés ; un peu moins joli et pratique que SugarCRM * Difficulté d’installation : relativement simple * Difficulté de configuration : très peu de configuration initiale * Difficulté de prise en main utilisateur : ''(non-suffisamment-testé-pour-avoir-un-avis)'' == CiviCRM == * Site : https://civicrm.org/ * Licence : AGPLv3 * Modèle économique : libre développé par une communauté de taille moyenne et une entreprise, quelques consultants dans le monde entier, installations hébergées (SaaS) proposées * Téléchargement : [https://civicrm.org/download/list tarball], [https://github.com/civicrm/civicrm-core dépôt Git] * Avis : assez adapté à la cible (grosses associations et non-profits, surtout dispersées géographiquement), demande un temps d’adaptation pour comprendre les concepts de base, puissant (en fonction du temps passé à le configurer) * Difficulté d’installation : pas trop compliquée * Difficulté de configuration : pas trop compliqué, mais long ou demandant une certaine habitude * Difficulté de prise en main utilisateur : une fois les concepts de base assimilés (4 h de formation ou quelques jours d’autoformation), les worflows semblent assez naturels a6cbc3fe6956063c560a6e86bab0113d99e1d5a5 458 456 2015-09-08T20:42:40Z Seb35 1 +dolibarr wikitext text/x-wiki Les '''CRM''' (Customer/Client Relationship Manager) ou '''GRC''' en français (gestion de la gelation client) permettent à une entreprise de consigner les différentes interactions qu’elle a avec un client donné. Les fonctionnalités varient beaucoup d’un logiciel à l’autre, et la délimitation peut parfois être fine entre les CRM et les ERP (Enterprise Ressource Planning, en français PGI/progiciel de gestion intégré), ces derniers étant globalement plus orientés vers la gestion backend de l’entreprise. Cette page se concentre sur les CRM libres : * CiviCRM, orienté associations d’une certaine taille et/ou dispersée géographiquement * SugarCRM, très orienté pour les commerciaux (logiciel limite libre) * SuiteCRM, fork récent de SugarCRM * vtiger CRM, fork plus ancien de SugarCRM * CremeCRM * Dolibarr * Odoo (anciennement OpenERP) * Galette, orienté petites associations pour la gestion d’adhérents == SugarCRM Community Edition == * Site : https://www.sugarcrm.com/ * Licence : AGPLv3 + conditions spécifiques non-libres à accepter y compris pour une installation locale (non-distribution des forks, sous-licenciement des données utilisateur, etc. = bizarre pour une installation locale, ça pourrait être justifié pour une installation hébergée/SaaS), nombreuses critiques sur le caractères (encore) libre de SugarCRM * Modèle économique : open-core, support pour éditions payantes, version libre et gratuite maintenue au minimum * Téléchargement : [http://sourceforge.net/projects/sugarcrm/files/ tarball sur SourceForge], pas de dépôt de gestion de version public ? * Avis : très orienté commercial : contacts clients, prospects, email en masse, ROI, appels programmés * Difficulté d’installation : relativement simple * Difficulté de configuration : très peu de configuration initiale * Difficulté de prise en main utilisateur : ''(non-suffisamment-testé-pour-avoir-un-avis)'' == SuiteCRM == * Site : https://suitecrm.com/ * Licence : AGPLv3 * Modèle économique : libre développé par une entreprise et une petite communauté, services et support payants, installation hébergée (SaaS) proposée * Téléchargement : [https://suitecrm.com/download tarball], [https://github.com/salesagility/SuiteCRM dépôt Git] * Avis : (similaire à SugarCRM) très orienté commercial : contacts clients, prospects, email en masse, ROI, appels programmés ; un peu moins joli et pratique que SugarCRM * Difficulté d’installation : relativement simple * Difficulté de configuration : très peu de configuration initiale * Difficulté de prise en main utilisateur : ''(non-suffisamment-testé-pour-avoir-un-avis)'' == CiviCRM == * Site : https://civicrm.org/ * Licence : AGPLv3 * Modèle économique : libre développé par une communauté de taille moyenne et une entreprise, quelques consultants dans le monde entier, installations hébergées (SaaS) proposées * Téléchargement : [https://civicrm.org/download/list tarball], [https://github.com/civicrm/civicrm-core dépôt Git] * Avis : assez adapté à la cible (grosses associations et non-profits, surtout dispersées géographiquement), demande un temps d’adaptation pour comprendre les concepts de base, puissant (en fonction du temps passé à le configurer) * Difficulté d’installation : pas trop compliquée * Difficulté de configuration : pas trop compliqué, mais long ou demandant une certaine habitude * Difficulté de prise en main utilisateur : une fois les concepts de base assimilés (4 h de formation ou quelques jours d’autoformation), les worflows semblent assez naturels == Dolibarr == * Site : http://www.dolibarr.org/ et http://www.dolibarr.fr/ * Licence : GPLv3+ * Modèle économique : libre développé par une communauté de taille moyenne, soutenu par une fondation dédiée, marché payant de plugins, quelques installations hébergées (SaaS) proposées * Téléchargement : [http://sourceforge.net/projects/dolibarr/files/ tarball], [https://github.com/Dolibarr/dolibarr dépôt Git] * Avis : * Difficulté d’installation : très facile (paquet Debian/Ubuntu) * Difficulté de configuration : simple et graduel : 2 modules de base à configurer, puis possibilité de configurer plus finement les modules activés * Difficulté de prise en main utilisateur : ''(à évaluer)'' 2eec207664ec5ba144c34b1bc630863c34f3dbd5 Fichier:Synchronised-pages-en-1-Database.png 6 147 459 2015-10-04T09:10:31Z Seb35 1 Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – first step out of three in the workflow. * Licence: CC0 * Author: Seb35 wikitext text/x-wiki Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – first step out of three in the workflow. * Licence: CC0 * Author: Seb35 5a1b0f84218a4ca42d243af18e0bb72f13893310 460 459 2015-10-04T09:34:23Z Seb35 1 +cat wikitext text/x-wiki Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – first step out of three in the workflow. * Licence: CC0 * Author: Seb35 [[Category:WordPress]] 80025e1edca31cbb20c6735577ac40ea3285005f 462 460 2015-10-04T09:36:00Z Seb35 1 +desc wikitext text/x-wiki Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – first step out of three in the workflow: create the database of all your events/pages you want to create. * Licence: CC0 * Author: Seb35 [[Category:WordPress]] 1a446299043d33c93a96d8bfe9da5d6ba8521034 Fichier:Synchronised-pages-en-2-Template.png 6 148 461 2015-10-04T09:35:19Z Seb35 1 Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – second step out of three in the workflow: create the template for your future pages. * Licence: CC0 * Author: Seb35 [[Category:WordPress]] wikitext text/x-wiki Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – second step out of three in the workflow: create the template for your future pages. * Licence: CC0 * Author: Seb35 [[Category:WordPress]] fcd755f60ff5b173b18a72a256582671c898d1ca Fichier:Synchronised-pages-en-3-Tool.png 6 149 463 2015-10-04T09:37:50Z Seb35 1 Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – third step out of three in the workflow: launch the tool. * Licence: CC0 * Author: Seb35 [[Category:WordPress]] wikitext text/x-wiki Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – third step out of three in the workflow: launch the tool. * Licence: CC0 * Author: Seb35 [[Category:WordPress]] e9b122ccec26c7c46196fa243645cc204713a0c7 Fichier:Synchronised-pages-en-4-List-of-posts.png 6 150 464 2015-10-04T09:39:09Z Seb35 1 Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – result: the list of generated posts in the admin view. * Licence: CC0 * Author: Seb35 [[Category:WordPress]] wikitext text/x-wiki Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – result: the list of generated posts in the admin view. * Licence: CC0 * Author: Seb35 [[Category:WordPress]] 956515a0449f4a7ec0f3bf5304edfc080136ca25 Fichier:Synchronised-pages-en-5-Generated-posts.png 6 151 465 2015-10-04T09:40:40Z Seb35 1 Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – result: the generated posts in the public view. * Licence: CC0 * Author: Seb35 [[Category:WordPress]] wikitext text/x-wiki Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – result: the generated posts in the public view. * Licence: CC0 * Author: Seb35 [[Category:WordPress]] d4df12a3a213ed92e0546c21653fa14b7457ac99 Catégorie:WordPress 14 152 466 2015-10-04T09:58:06Z Seb35 1 Page créée avec « [[Catégorie:Racine]] » wikitext text/x-wiki [[Catégorie:Racine]] 129a48f152ec5efbe3262fb58ee49b7b04112cb5 WordPress plugin Synchronised Pages 0 153 467 2015-10-04T09:59:21Z Seb35 1 Description of my WordPress plugin Synchronised Pages wikitext text/x-wiki The WordPress plugin “Synchronised Pages” empower you in creating a lot of pages according to a template in which you can remplace some parts of the template with specific informations contained in a database. == Description == An easy way to describe this plugin is to give an example: imagine you want to create a small website for a festival in which each concert has specific hours, title, band/musicians, description… Without this plugin, you have to create by hand all the pages. With this plugin you can put all informations in a spreadsheet, create a template for the pages, and then automatically generate all the pages. <gallery mode="packed" caption="The three steps of the workflow" heights="250px"> File:Synchronised-pages-en-1-Database.png|1. Create the database of all your events/pages you want to create File:Synchronised-pages-en-2-Template.png|2. Create the template for your futures pages File:Synchronised-pages-en-3-Tool.png|3. Launch the tool </gallery> <gallery mode="packed" caption="The result" heights="250px"> File:Synchronised-pages-en-4-List-of-posts.png|The list of generated posts in the admin view File:Synchronised-pages-en-5-Generated-posts.png|The generated posts in the public view </gallery> == Installation == This section describes how to install the plugin and get it working. # Upload the directory <code>synchronised-pages</code> in the <code>/wp-content/plugins/</code> directory # Activate the plugin through the “Plugins” menu in WordPress With default settings, you can only generate pages, not posts; you can change this setting in the menu Settings > Writing > Synchronised Pages. == Frequently Asked Questions == === Are the templates public? === No. They are similar to Private posts. === If some pages already exist, are they remplaced or re-created? === Currently, pages whose the title already exist are remplaced, so the old content is overwritten by the generated new content. Possibly in the future, an option will give the choice. == Changelog == === 0.1 === Current version. Working and stable plugin, could be 1.0 but some parts of code should be rewritten. [[Category:WordPress]] 5478f83d31b3a64e16f71569815b2efbc572c545 WordPress plugin Synchronised Pages 0 153 468 467 2015-10-04T10:55:40Z Seb35 1 +download link, +1 faq, +Development wikitext text/x-wiki The WordPress plugin “Synchronised Pages” empower you in creating a lot of pages according to a template in which you can remplace some parts of the template with specific informations contained in a database. == Description == An easy way to describe this plugin is to give an example: imagine you want to create a small website for a festival in which each concert has specific hours, title, band/musicians, description… Without this plugin, you have to create by hand all the pages. With this plugin you can put all informations in a spreadsheet, create a template for the pages, and then automatically generate all the pages. <gallery mode="packed" caption="The three steps of the workflow" heights="250px"> File:Synchronised-pages-en-1-Database.png|1. Create the database of all your events/pages you want to create File:Synchronised-pages-en-2-Template.png|2. Create the template for your futures pages File:Synchronised-pages-en-3-Tool.png|3. Launch the tool </gallery> <gallery mode="packed" caption="The result" heights="250px"> File:Synchronised-pages-en-4-List-of-posts.png|The list of generated posts in the admin view File:Synchronised-pages-en-5-Generated-posts.png|The generated posts in the public view </gallery> == Installation == This section describes how to install the plugin and get it working. # Download the code from GitHub: https://github.com/Seb35/Synchronised-Pages/archive/master.zip # Upload the directory <code>synchronised-pages</code> in the <code>/wp-content/plugins/</code> directory # Activate the plugin through the “Plugins” menu in WordPress With default settings, you can only generate pages, not posts; you can change this setting in the menu Settings > Writing > Synchronised Pages. == Frequently Asked Questions == === Are the templates public? === No. They are similar to Private posts. === If some pages already exist, are they remplaced or re-created? === Currently, pages whose the title already exist are remplaced, so the old content is overwritten by the generated new content. Possibly in the future, an option will give the choice. === Is it the same thing as “child pages”? === Not exactly. Child pages is a feature specific for the post type “Page” (not standard “Posts”) where you can say a given page is a child of some other page, it is useful to show a hierarchical list of pages. Here the synchronised pages are only similar in their layout. But if you want make that all synchronised pages have a parent page, it’s up to you to make it – you can automatically get the list of all synchronised pages from a given import. == Changelog == === 0.1 === Current version. Working and stable plugin, could be 1.0 but some parts of code should be rewritten. == Development == Development is done on GitHub, in the repository [https://github.com/Seb35/Synchronised-Pages Seb35/Synchronised-Pages]. You can report bugs or ask features in the [https://github.com/Seb35/Synchronised-Pages/issues bug tracker], and if you are a developer you are welcome to submit [https://github.com/Seb35/Synchronised-Pages/pulls pull request]. Versions on GitHub will be send back to the officiel WordPress repository. [[Category:WordPress]] 7a7995558f5018b52ce3b2707debb9a6b8df581e 469 468 2015-10-04T11:47:55Z Seb35 1 +version 0.2.0 (public) wikitext text/x-wiki The WordPress plugin “Synchronised Pages” empower you in creating a lot of pages according to a template in which you can remplace some parts of the template with specific informations contained in a database. == Description == An easy way to describe this plugin is to give an example: imagine you want to create a small website for a festival in which each concert has specific hours, title, band/musicians, description… Without this plugin, you have to create by hand all the pages. With this plugin you can put all informations in a spreadsheet, create a template for the pages, and then automatically generate all the pages. <gallery mode="packed" caption="The three steps of the workflow" heights="250px"> File:Synchronised-pages-en-1-Database.png|1. Create the database of all your events/pages you want to create File:Synchronised-pages-en-2-Template.png|2. Create the template for your futures pages File:Synchronised-pages-en-3-Tool.png|3. Launch the tool </gallery> <gallery mode="packed" caption="The result" heights="250px"> File:Synchronised-pages-en-4-List-of-posts.png|The list of generated posts in the admin view File:Synchronised-pages-en-5-Generated-posts.png|The generated posts in the public view </gallery> == Installation == This section describes how to install the plugin and get it working. # Download the code from GitHub: https://github.com/Seb35/Synchronised-Pages/archive/master.zip # Upload the directory <code>synchronised-pages</code> in the <code>/wp-content/plugins/</code> directory # Activate the plugin through the “Plugins” menu in WordPress With default settings, you can only generate pages, not posts; you can change this setting in the menu Settings > Writing > Synchronised Pages. == Frequently Asked Questions == === Are the templates public? === No. They are similar to Private posts. === If some pages already exist, are they remplaced or re-created? === Currently, pages whose the title already exist are remplaced, so the old content is overwritten by the generated new content. Possibly in the future, an option will give the choice. === Is it the same thing as “child pages”? === Not exactly. Child pages is a feature specific for the post type “Page” (not standard “Posts”) where you can say a given page is a child of some other page, it is useful to show a hierarchical list of pages. Here the synchronised pages are only similar in their layout. But if you want make that all synchronised pages have a parent page, it’s up to you to make it – you can automatically get the list of all synchronised pages from a given import. == Changelog == === 0.2 === Beta version. First public version. === 0.1 === Current version. Working and stable plugin, could be 1.0 but some parts of code should be rewritten. == Development == Development is done on GitHub, in the repository [https://github.com/Seb35/Synchronised-Pages Seb35/Synchronised-Pages]. You can report bugs or ask features in the [https://github.com/Seb35/Synchronised-Pages/issues bug tracker], and if you are a developer you are welcome to submit [https://github.com/Seb35/Synchronised-Pages/pulls pull request]. Versions on GitHub will be send back to the officiel WordPress repository. [[Category:WordPress]] f0556771a8a8e62a806cbc1b8323cfa742953719 Accueil 0 1 560 457 2016-07-16T15:43:29Z Seb35 1 +lien pour télécharger cette page avec Git wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.) Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : :<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code> == Pages du wiki == === Tutoriaux === * [[Tutorial:Beautiful MediaWiki URLs]] * [[Tutorial:Packaging de WebApps]] === Autres === * [[Présentation:Wikis]] * [[CRM]] (comparaison de CRMs libres) * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] d51be7fbc95baf86cf7b3260af766bd4a941a354 577 560 2016-12-03T12:22:48Z Seb35 1 +Special:Version wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.) Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : :<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code> == Pages du wiki == [[Special:Version]] === Tutoriaux === * [[Tutorial:Beautiful MediaWiki URLs]] * [[Tutorial:Packaging de WebApps]] === Autres === * [[Présentation:Wikis]] * [[CRM]] (comparaison de CRMs libres) * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] c5946dc3602736b8390e731fbeef4fb59f887281 167798 577 2019-02-02T17:14:54Z Seb35 1 /* Pages du wiki */ wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.) Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : :<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code> == Pages du wiki == [[Special:Version]] === Tutoriaux === * [[Tutorial:Beautiful MediaWiki URLs]] * [[Tutorial:Packaging de WebApps]] === Autres === * [[Présentation:Wikis]] * [[CRM]] (comparaison de CRMs libres) * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] === Technique === * [[Btrfs]] (technique, en anglais) cd9da6c3c82e7a77ed5d859f614ef2c7483c7d8f 167800 167798 2019-02-02T17:15:00Z Seb35 1 /* Technique */ wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.) Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : :<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code> == Pages du wiki == [[Special:Version]] === Tutoriaux === * [[Tutorial:Beautiful MediaWiki URLs]] * [[Tutorial:Packaging de WebApps]] === Autres === * [[Présentation:Wikis]] * [[CRM]] (comparaison de CRMs libres) * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] === Technique === * [[Btrfs]] (en anglais) 6cf40bd10e68c47ed3c654f585b8477433d8d85f 429789 167800 2019-09-11T21:26:49Z Seb35 1 /* Technique */ wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.) Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : :<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code> == Pages du wiki == [[Special:Version]] === Tutoriaux === * [[Tutorial:Beautiful MediaWiki URLs]] * [[Tutorial:Packaging de WebApps]] === Autres === * [[Présentation:Wikis]] * [[CRM]] (comparaison de CRMs libres) * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] === Technique === * [[Btrfs]] (en anglais) * [[Unicode]] d962b6fd8ec8e2e880851a37c74f187738bf1242 543924 429789 2019-11-21T03:15:12Z 109.126.199.176 0 Лучшие идеи бизнеса и заработка денег wikitext text/x-wiki Это хороший сайт 655e4041ad989a2d2c7af71a44066426051bbf57 590755 543924 2019-12-26T12:07:58Z 31.28.204.60 0 Лучшие идеи бизнеса и заработка денег wikitext text/x-wiki Узнайте на сайте d5c2efef75a7d93532cd50e5dc1e975f936fa79e 658075 590755 2020-03-07T16:21:44Z Seb35 1 revert wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.) Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : :<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code> == Pages du wiki == [[Special:Version]] === Tutoriaux === * [[Tutorial:Beautiful MediaWiki URLs]] * [[Tutorial:Packaging de WebApps]] === Autres === * [[Présentation:Wikis]] * [[CRM]] (comparaison de CRMs libres) * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] === Technique === * [[Btrfs]] (en anglais) * [[Unicode]] d962b6fd8ec8e2e880851a37c74f187738bf1242 Extension:GitSynchro 0 161 561 2016-07-16T16:35:10Z Seb35 1 explication du raisonnement, avancement, idées prospectives wikitext text/x-wiki Cette extension '''GitSynchro''', que je suis en train de développer, a pour but de télécharger et de téléverser les pages d’un wiki MediaWiki au travers de [[:wikipedia:fr:Git]]. La raison sous-jacente à cette extension est la possibilité d’éditer hors-ligne un wiki, puis de téléverser sur le wiki en-ligne dès que la connexion Internet est retrouvée. Pour en avoir discuté avec plusieurs personnes, cette fonctionnalité d’« édition hors-ligne » peut combler un certain besoin, mais les avis divergent sur les usages qu’il faudrait en avoir. Vu que cette fonctionnalité n’existe pas, cette extension apporte une possibilité technique. Ensuite, elle devra être testée en conditions réelles et les workflows devront probablement être ajustés. Noter également que Git n’est pas un logiciel très user-friendly mais les technologies sous-jacentes sont assez puissantes, aussi « l’édition hors-ligne » ne se fera probablement pas directement avec Git (sauf pour les personnes expérimentées), mais au moyen d’interfaces graphiques exploitant Git en interne pour les aspects stockage local et synchronisation distante. == Exemple == Accès en lecture seule : :<code>git clone http://wiki.seb35.fr/Extension:GitSynchro</code> == Avancement == * <s>Lecture</s> * Écriture ** Authentification avec l’extension auth_request de nginx *** <s>Création d’un module à ajouter à l’API renvoyant 200/401/403 selon si la requête est ok/mauvaise authentification/interdite</s> *** Utilisation de AuthManager pour se connecter au moyen de l’API clientlogin pour récupérer un jeton qui sera utilisé par le hook Git qui fera l’écriture au moyen de l’API edit ** Hook Git réalisant l’écriture effective dans MediaWiki des commits reçus *** Le hook Git le plus adapté est amha [https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks update] pour avoir une possibilité de refuser en cas de conflit d’édition *** Édition au moyen de l’API edit en récupérant le nom du serveur dans l’adresse "email" du committer, mais pour cela il faut récupérer à un moment donné le mot de passe du committer (qu’il a entré lors du push) ou un jeton émis à la suite de l’authentification du push * Création d’un hook client Git prepare-commit-msg destiné à formater très exactement le message de commit, car s’il n’est pas exactement conforme à ce que le serveur crée de son côté il faudra que le serveur le modifie et crée un commit différent, ce qui ferait diverger à chaque push le client et le serveur *: Dans cette même logique, il faut que le client ait accès à l’ensemble des informations nécessaires à la création d’un commit ; par exemple, j’avais envisagé d’inscrire le numéro de la révision MediaWiki dans le message de commit, mais le client n’a pas cette information ; en revanche, il serait éventuellement possible, si cela a un intérêt, d’inscrire l’identifiant interne du texte committé, qui est simplement le SHA1 du texte, donc connu du client == Git flavour == J’ai déjà eu l’occasion de créer une passerelle Git – cf [https://archeo-lex.fr Archéo Lex] visant à publier la loi française sous Git – et, une fois la technique de base achevée, de nombreuses questions apparaissent sur la façon d’organiser les choses, et de façon sous-jacente les workflows et les usages. Dans Archéo Lex, je citerai deux exemples : * en légistique française, il y a certains textes qui n’ont pas encore de date de publication (car en attente d’un décret, etc.), mais Git n’a pas cette notion de « date inconnue à déterminer ultérieurement », il faut donc définir une convention * les lois peuvent être toutes rangées dans un seul répertoire à raison d’un fichier par loi, mais Git ne sait pas avoir plusieurs historiques distincts dans un seul répertoire ; donc il faut un répertoire par loi, mais met-on un seul fichier dans ce répertoire ou fait-on des sous-répertoires par livre, section, article ? Rassemble-t-on l’ensemble des lois dans un répertoire principal versionné avec des sous-modules Git ? (ou d’autres technologies Git de séparation d’historique comme les subtrees ou les subrepos) Ici, il est probable qu’un repo Git corresponde à un article avec son historique propre, et donc en conséquence un sous-dossier par article, chaque sous-dossier contenant un unique fichier. Le format du message de commit devra être arrêté, en tenant compte des diverses contraintes ; il peut y avoir plusieurs formats potentiels, mais un seul par wiki. Ensuite, la première difficulté d’organisation et d’utilisation viendra lorsqu’il faudra gérer plusieurs articles. Les interfaces graphiques prendront probablement en charge la synchronisation sous-jacente des historiques. En ligne de commande, il faudra probablement créer une commande permettant de visualiser l’état de la synchronisation d’un ensemble de fichiers/articles. 66d2b42656f8a3c1f410f933d0d64701e297cc09 562 561 2016-07-16T16:37:36Z Seb35 1 un autre commit wikitext text/x-wiki Cette extension '''GitSynchro''', que je suis en train de développer, a pour but de télécharger et de téléverser les pages d’un wiki MediaWiki au travers de [[:wikipedia:fr:Git]]. La raison sous-jacente à cette extension est la possibilité d’éditer hors-ligne un wiki, puis de téléverser sur le wiki en-ligne dès que la connexion Internet est retrouvée. Pour en avoir discuté avec plusieurs personnes, cette fonctionnalité d’« édition hors-ligne » peut combler un certain besoin, mais les avis divergent sur les usages qu’il faudrait en avoir. Vu que cette fonctionnalité n’existe pas, cette extension apporte une possibilité technique. Ensuite, elle devra être testée en conditions réelles et les workflows devront probablement être ajustés. Noter également que Git n’est pas un logiciel très user-friendly mais les technologies sous-jacentes sont assez puissantes, aussi « l’édition hors-ligne » ne se fera probablement pas directement avec Git (sauf pour les personnes expérimentées), mais au moyen d’interfaces graphiques exploitant Git en interne pour les aspects stockage local et synchronisation distante. == Exemple == Accès en lecture seule : :<code>git clone <nowiki>http://wiki.seb35.fr/Extension:GitSynchro</nowiki></code> == Avancement == * <s>Lecture</s> * Écriture ** Authentification avec l’extension auth_request de nginx *** <s>Création d’un module à ajouter à l’API renvoyant 200/401/403 selon si la requête est ok/mauvaise authentification/interdite</s> *** Utilisation de AuthManager pour se connecter au moyen de l’API clientlogin pour récupérer un jeton qui sera utilisé par le hook Git qui fera l’écriture au moyen de l’API edit ** Hook Git réalisant l’écriture effective dans MediaWiki des commits reçus *** Le hook Git le plus adapté est amha [https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks update] pour avoir une possibilité de refuser en cas de conflit d’édition *** Édition au moyen de l’API edit en récupérant le nom du serveur dans l’adresse "email" du committer, mais pour cela il faut récupérer à un moment donné le mot de passe du committer (qu’il a entré lors du push) ou un jeton émis à la suite de l’authentification du push * Création d’un hook client Git prepare-commit-msg destiné à formater très exactement le message de commit, car s’il n’est pas exactement conforme à ce que le serveur crée de son côté il faudra que le serveur le modifie et crée un commit différent, ce qui ferait diverger à chaque push le client et le serveur *: Dans cette même logique, il faut que le client ait accès à l’ensemble des informations nécessaires à la création d’un commit ; par exemple, j’avais envisagé d’inscrire le numéro de la révision MediaWiki dans le message de commit, mais le client n’a pas cette information ; en revanche, il serait éventuellement possible, si cela a un intérêt, d’inscrire l’identifiant interne du texte committé, qui est simplement le SHA1 du texte, donc connu du client == Git flavour == J’ai déjà eu l’occasion de créer une passerelle Git – cf [https://archeo-lex.fr Archéo Lex] visant à publier la loi française sous Git – et, une fois la technique de base achevée, de nombreuses questions apparaissent sur la façon d’organiser les choses, et de façon sous-jacente les workflows et les usages. Dans Archéo Lex, je citerai deux exemples : * en légistique française, il y a certains textes qui n’ont pas encore de date de publication (car en attente d’un décret, etc.), mais Git n’a pas cette notion de « date inconnue à déterminer ultérieurement », il faut donc définir une convention * les lois peuvent être toutes rangées dans un seul répertoire à raison d’un fichier par loi, mais Git ne sait pas avoir plusieurs historiques distincts dans un seul répertoire ; donc il faut un répertoire par loi, mais met-on un seul fichier dans ce répertoire ou fait-on des sous-répertoires par livre, section, article ? Rassemble-t-on l’ensemble des lois dans un répertoire principal versionné avec des sous-modules Git ? (ou d’autres technologies Git de séparation d’historique comme les subtrees ou les subrepos) Ici, il est probable qu’un repo Git corresponde à un article avec son historique propre, et donc en conséquence un sous-dossier par article, chaque sous-dossier contenant un unique fichier. Le format du message de commit devra être arrêté, en tenant compte des diverses contraintes ; il peut y avoir plusieurs formats potentiels, mais un seul par wiki. Ensuite, la première difficulté d’organisation et d’utilisation viendra lorsqu’il faudra gérer plusieurs articles. Les interfaces graphiques prendront probablement en charge la synchronisation sous-jacente des historiques. En ligne de commande, il faudra probablement créer une commande permettant de visualiser l’état de la synchronisation d’un ensemble de fichiers/articles. 58d957565e65c1e66494b748923860bb029107eb MediaWikiFarm static analysis 0 162 566 2016-11-20T21:02:13Z Seb35 1 Page créée avec « {| class="wikitable" |- ! rowspan="3" colspan="2" | Time ↧<br /><span style="font-weight:normal;"> <span id="link-mode-monoversion">Monoversion</span> / <span id="link-m... » wikitext text/x-wiki {| class="wikitable" |- ! rowspan="3" colspan="2" | Time ↧<br /><span style="font-weight:normal;"> <span id="link-mode-monoversion">Monoversion</span> / <span id="link-mode-multiversion" class="link-selected">Multiversion</span><br /> <span id="link-cache-no">No cache</span> / <span id="link-cache-empty" class="link-selected">Empty</span> / <span id="link-cache-loaded">Loaded</span><br /> <span id="link-deployment-with" class="link-selected">With</span> / <span id="link-deployment-without">Without</span> deployment file<br /> <span id="link-env-web" class="link-selected">Web</span> / <span id="link-env-cli">CLI</span> / <span id="link-env-update">update</span><br /> <span id="link-all">(All)</span> - As of [https://phabricator.wikimedia.org/rEMWF1b151729d9eee8feae601c6b0fc20469c8b86117 1b15172] </span> ! colspan="16" | Properties ! colspan="9" | Files |- | rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | farmDir | rowspan="2" style="transform:rotate(-90deg) translate(-1.3em); max-width:2.4em; width:2.4em;" | configDir | rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | codeDir | rowspan="2" style="transform:rotate(-90deg) translate(-1.15em); max-width:2.4em; width:2.4em;" | cacheDir | colspan="2" style="text-align:center;" | params | colspan="4" style="text-align:center;" | farmConfig | colspan="3" style="text-align:center;" | variables | colspan="3" style="text-align:center;" | configuration | rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | farms.yml | rowspan="2" style="transform:rotate(-90deg) translate(-2.2em); max-width:2.4em; width:2.4em;" | variable.yml | rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | config.yml | rowspan="2" style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | versions.yml | rowspan="2" style="transform:rotate(-90deg) translate(-3.3em); max-width:2.4em; width:2.4em;" | deployments.php | rowspan="2" style="transform:rotate(-90deg) translate(-4.0em); max-width:2.4em; width:2.4em;" | (cache)&nbsp;versions.php | rowspan="2" style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | (cache)&nbsp;config.php | rowspan="2" style="transform:rotate(-90deg) translate(-5.4em); max-width:2.4em; width:2.4em; height:13.5em;" | (cache)&nbsp;LocalSettings.php | rowspan="2" style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em; height:13.5em;" | main.php |- | style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em;" | 'EntryPoint' | style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em; height:10em;" | 'ExtensionRegistry' | style="transform:rotate(-90deg) translate(-1.0em); max-width:2.4em; width:2.4em;" | 'variables' | style="transform:rotate(-90deg) translate(-2.0em); max-width:2.4em; width:2.4em;" | 'coreconfig' | style="transform:rotate(-90deg) translate(-0.1em); max-width:2.4em; width:2.4em;" | 'config' | style="transform:rotate(-90deg) translate( 0.3em); max-width:2.4em; width:2.4em;" | Other | style="transform:rotate(-90deg) translate(-1.2em); max-width:2.4em; width:2.4em;" | '$CODE' | style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | '$VERSION' | style="transform:rotate(-90deg) translate(-0.5em); max-width:2.4em; width:2.4em;" | Other | style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | 'settings'&nbsp;/&nbsp;'arrays' | style="transform:rotate(-90deg) translate(-3.8em); max-width:2.4em; width:2.4em;" | 'extensions'&nbsp;/&nbsp;'skins' | style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | 'execFiles' |- | rowspan="11" style="transform:rotate(-90deg) translate(-1.4em); max-width:1.5em;" | Existence | <code>load</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>__construct</code> | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{set}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{set}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>selectFarm</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>checkExistence</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>checkHostVariables</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>setVersion</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>setOtherVariables</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>getConfigFile</code> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>setVariable</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>updateVersionAfterMaintenance</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>updateVersion</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{read}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="mode-default-hide show-when-mode-multiversion">{{read}}</span><span class="mode-default-show hide-when-mode-multiversion void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{set}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | rowspan="6" style="transform:rotate(-90deg) translate(-2.5em); max-width:1.5em;" | Configuration | <code>loadMediaWikiConfig</code> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>getMediaWikiConfig</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;↳</span> <code>populateSettings</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;↳</span> <code>extractSkinsAndExtensions</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;&#x7c;&nbsp;&nbsp;↳</span> <code>detectLoadingMechanism</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;↳</span> <code>createLocalSettings</code> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | rowspan="4" style="transform:rotate(-90deg) translate(-0.55em); max-width:1.5em;" | Utility | <code>isLocalSettingsFresh</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-empty hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>replaceVariable</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>readFile</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>cacheFile</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | colspan="2" | (MediaWiki) | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> |} 8157f0250dd243354d4f1dd130343e29896f12d3 573 566 2016-11-20T21:36:32Z Seb35 1 +explanations wikitext text/x-wiki ([[#Explanations (English)|explanation below]] - [[#Explications (français)|explications ci-dessous)]] {| class="wikitable" |- ! rowspan="3" colspan="2" | Time ↧<br /><span style="font-weight:normal;"> <span id="link-mode-monoversion">Monoversion</span> / <span id="link-mode-multiversion" class="link-selected">Multiversion</span><br /> <span id="link-cache-no">No cache</span> / <span id="link-cache-empty" class="link-selected">Empty</span> / <span id="link-cache-loaded">Loaded</span><br /> <span id="link-deployment-with" class="link-selected">With</span> / <span id="link-deployment-without">Without</span> deployment file<br /> <span id="link-env-web" class="link-selected">Web</span> / <span id="link-env-cli">CLI</span> / <span id="link-env-update">update</span><br /> <span id="link-all">(All)</span> - As of [https://phabricator.wikimedia.org/rEMWF1b151729d9eee8feae601c6b0fc20469c8b86117 1b15172] </span> ! colspan="16" | Properties ! colspan="9" | Files |- | rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | farmDir | rowspan="2" style="transform:rotate(-90deg) translate(-1.3em); max-width:2.4em; width:2.4em;" | configDir | rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | codeDir | rowspan="2" style="transform:rotate(-90deg) translate(-1.15em); max-width:2.4em; width:2.4em;" | cacheDir | colspan="2" style="text-align:center;" | params | colspan="4" style="text-align:center;" | farmConfig | colspan="3" style="text-align:center;" | variables | colspan="3" style="text-align:center;" | configuration | rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | farms.yml | rowspan="2" style="transform:rotate(-90deg) translate(-2.2em); max-width:2.4em; width:2.4em;" | variable.yml | rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | config.yml | rowspan="2" style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | versions.yml | rowspan="2" style="transform:rotate(-90deg) translate(-3.3em); max-width:2.4em; width:2.4em;" | deployments.php | rowspan="2" style="transform:rotate(-90deg) translate(-4.0em); max-width:2.4em; width:2.4em;" | (cache)&nbsp;versions.php | rowspan="2" style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | (cache)&nbsp;config.php | rowspan="2" style="transform:rotate(-90deg) translate(-5.4em); max-width:2.4em; width:2.4em; height:13.5em;" | (cache)&nbsp;LocalSettings.php | rowspan="2" style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em; height:13.5em;" | main.php |- | style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em;" | 'EntryPoint' | style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em; height:10em;" | 'ExtensionRegistry' | style="transform:rotate(-90deg) translate(-1.0em); max-width:2.4em; width:2.4em;" | 'variables' | style="transform:rotate(-90deg) translate(-2.0em); max-width:2.4em; width:2.4em;" | 'coreconfig' | style="transform:rotate(-90deg) translate(-0.1em); max-width:2.4em; width:2.4em;" | 'config' | style="transform:rotate(-90deg) translate( 0.3em); max-width:2.4em; width:2.4em;" | Other | style="transform:rotate(-90deg) translate(-1.2em); max-width:2.4em; width:2.4em;" | '$CODE' | style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | '$VERSION' | style="transform:rotate(-90deg) translate(-0.5em); max-width:2.4em; width:2.4em;" | Other | style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | 'settings'&nbsp;/&nbsp;'arrays' | style="transform:rotate(-90deg) translate(-3.8em); max-width:2.4em; width:2.4em;" | 'extensions'&nbsp;/&nbsp;'skins' | style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | 'execFiles' |- | rowspan="11" style="transform:rotate(-90deg) translate(-1.4em); max-width:1.5em;" | Existence | <code>load</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>__construct</code> | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{set}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{set}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>selectFarm</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>checkExistence</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>checkHostVariables</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>setVersion</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>setOtherVariables</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>getConfigFile</code> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>setVariable</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>updateVersionAfterMaintenance</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>updateVersion</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{read}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="mode-default-hide show-when-mode-multiversion">{{read}}</span><span class="mode-default-show hide-when-mode-multiversion void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{set}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | rowspan="6" style="transform:rotate(-90deg) translate(-2.5em); max-width:1.5em;" | Configuration | <code>loadMediaWikiConfig</code> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>getMediaWikiConfig</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;↳</span> <code>populateSettings</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;↳</span> <code>extractSkinsAndExtensions</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;&#x7c;&nbsp;&nbsp;↳</span> <code>detectLoadingMechanism</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;↳</span> <code>createLocalSettings</code> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | rowspan="4" style="transform:rotate(-90deg) translate(-0.55em); max-width:1.5em;" | Utility | <code>isLocalSettingsFresh</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-empty hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>replaceVariable</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>readFile</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>cacheFile</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | colspan="2" | (MediaWiki) | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> |} == Explanations (English) == This is a hand-made matrix describing what function read or modify what internal data for the software [https://phabricator.wikimedia.org/diffusion/EMWF/ MediaWikiFarm], a MediaWiki "extension" to manage MediaWiki farms of wikis. This represents the class [https://phabricator.wikimedia.org/diffusion/EMWF/browse/master/src/MediaWikiFarm.php MediaWikiFarm], which is the main class containing almost all logic. Each row is a method (roughly sorted by chronological order in a typical run) and each column is a class property (all are protected). In each cell, there is either: * {{read}}: the property is (only) read in the method; * {{set}}: the property is set in the method (and possibly read); * {{-}}: the property is neither read or set in the method. In my previous <s>games</s> works on static analysis, I created [[:mw:File:Call graph of extension MediaWikiFarm.svg|the call graph]] with an external software. But, to be more exact, this call graph is only [[:wikipedia:Call graph|an overapproximation]] since the exact (dynamic) call graph is a subset of this one: in a run, possibly some paths are not executed since it depends on the context. Here, this is the "data graph", and there are different contexts: on the top left, you can choose the various main contexts in which the software can run. This depends mainly from the environment and the configuration, and the possibilities are only the main ones. The main result coming from this representation is: "the cache drastically reduces the processing". In fact this is not a surprise, it was designed for it, but such a sparse matrix is encouraging and help to visualise the inter-relations. When benchmarking the software, a no-cache run takes 10-15 milliseconds, and a with-cache run takes 85 microseconds (roughly 130 times less). == Explications (français) == b04411424247a4a6d571ed783c2d4b95f0e49a3a 574 573 2016-11-20T23:03:25Z Seb35 1 +fr wikitext text/x-wiki ([[#Explanations (English)|explanation below]] - [[#Explications (français)|explications ci-dessous)]] {| class="wikitable" |- ! rowspan="3" colspan="2" | Time ↧<br /><span style="font-weight:normal;"> <span id="link-mode-monoversion">Monoversion</span> / <span id="link-mode-multiversion" class="link-selected">Multiversion</span><br /> <span id="link-cache-no">No cache</span> / <span id="link-cache-empty" class="link-selected">Empty</span> / <span id="link-cache-loaded">Loaded</span><br /> <span id="link-deployment-with" class="link-selected">With</span> / <span id="link-deployment-without">Without</span> deployment file<br /> <span id="link-env-web" class="link-selected">Web</span> / <span id="link-env-cli">CLI</span> / <span id="link-env-update">update</span><br /> <span id="link-all">(All)</span> - As of [https://phabricator.wikimedia.org/rEMWF1b151729d9eee8feae601c6b0fc20469c8b86117 1b15172] </span> ! colspan="16" | Properties ! colspan="9" | Files |- | rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | farmDir | rowspan="2" style="transform:rotate(-90deg) translate(-1.3em); max-width:2.4em; width:2.4em;" | configDir | rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | codeDir | rowspan="2" style="transform:rotate(-90deg) translate(-1.15em); max-width:2.4em; width:2.4em;" | cacheDir | colspan="2" style="text-align:center;" | params | colspan="4" style="text-align:center;" | farmConfig | colspan="3" style="text-align:center;" | variables | colspan="3" style="text-align:center;" | configuration | rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | farms.yml | rowspan="2" style="transform:rotate(-90deg) translate(-2.2em); max-width:2.4em; width:2.4em;" | variable.yml | rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | config.yml | rowspan="2" style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | versions.yml | rowspan="2" style="transform:rotate(-90deg) translate(-3.3em); max-width:2.4em; width:2.4em;" | deployments.php | rowspan="2" style="transform:rotate(-90deg) translate(-4.0em); max-width:2.4em; width:2.4em;" | (cache)&nbsp;versions.php | rowspan="2" style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | (cache)&nbsp;config.php | rowspan="2" style="transform:rotate(-90deg) translate(-5.4em); max-width:2.4em; width:2.4em; height:13.5em;" | (cache)&nbsp;LocalSettings.php | rowspan="2" style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em; height:13.5em;" | main.php |- | style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em;" | 'EntryPoint' | style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em; height:10em;" | 'ExtensionRegistry' | style="transform:rotate(-90deg) translate(-1.0em); max-width:2.4em; width:2.4em;" | 'variables' | style="transform:rotate(-90deg) translate(-2.0em); max-width:2.4em; width:2.4em;" | 'coreconfig' | style="transform:rotate(-90deg) translate(-0.1em); max-width:2.4em; width:2.4em;" | 'config' | style="transform:rotate(-90deg) translate( 0.3em); max-width:2.4em; width:2.4em;" | Other | style="transform:rotate(-90deg) translate(-1.2em); max-width:2.4em; width:2.4em;" | '$CODE' | style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | '$VERSION' | style="transform:rotate(-90deg) translate(-0.5em); max-width:2.4em; width:2.4em;" | Other | style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | 'settings'&nbsp;/&nbsp;'arrays' | style="transform:rotate(-90deg) translate(-3.8em); max-width:2.4em; width:2.4em;" | 'extensions'&nbsp;/&nbsp;'skins' | style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | 'execFiles' |- | rowspan="11" style="transform:rotate(-90deg) translate(-1.4em); max-width:1.5em;" | Existence | <code>load</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>__construct</code> | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{set}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{set}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>selectFarm</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>checkExistence</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>checkHostVariables</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>setVersion</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>setOtherVariables</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>getConfigFile</code> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>setVariable</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>updateVersionAfterMaintenance</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>updateVersion</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{read}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="mode-default-hide show-when-mode-multiversion">{{read}}</span><span class="mode-default-show hide-when-mode-multiversion void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{set}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | rowspan="6" style="transform:rotate(-90deg) translate(-2.5em); max-width:1.5em;" | Configuration | <code>loadMediaWikiConfig</code> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>getMediaWikiConfig</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;↳</span> <code>populateSettings</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;↳</span> <code>extractSkinsAndExtensions</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;&#x7c;&nbsp;&nbsp;↳</span> <code>detectLoadingMechanism</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;↳</span> <code>createLocalSettings</code> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | rowspan="4" style="transform:rotate(-90deg) translate(-0.55em); max-width:1.5em;" | Utility | <code>isLocalSettingsFresh</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-empty hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>replaceVariable</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>readFile</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>cacheFile</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | colspan="2" | (MediaWiki) | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> |} == Explanations (English) == This is a hand-made matrix describing what function read or modify what internal data for the software [https://phabricator.wikimedia.org/diffusion/EMWF/ MediaWikiFarm], a MediaWiki "extension" to manage MediaWiki farms of wikis. This represents the class [https://phabricator.wikimedia.org/diffusion/EMWF/browse/master/src/MediaWikiFarm.php MediaWikiFarm], which is the main class containing almost all logic. Each row is a method (roughly sorted by chronological order in a typical run) and each column is a class property (all are protected). In each cell, there is either: * {{read}}: the property is (only) read in the method; * {{set}}: the property is set in the method (and possibly read); * {{-}}: the property is neither read or set in the method. In my previous <s>games</s> works on static analysis of this software, I created [[:mw:File:Call graph of extension MediaWikiFarm.svg|the call graph]] with an external software. But, to be more exact, this call graph is only [[:wikipedia:Call graph|an overapproximation]] since the exact (dynamic) call graph is a subset of this one: in a run, possibly some paths are not executed since it depends on the context. Here, this is the "data graph", and there are different contexts: on the top left, you can choose the various main contexts in which the software can run. This depends mainly from the environment and the configuration, and the possibilities listed here are only the main ones. The main result coming from this representation is: "the cache drastically reduces the processing". In fact this is not a surprise, it was designed for it, but such a sparse matrix is encouraging and help to visualise the inter-relations. When benchmarking the software, a no-cache run takes 10-15 milliseconds, and a with-cache run takes 85 microseconds (roughly 130 times less). == Explications (français) == Ceci est une matrice créée à la main qui décrit quels fonctions lisent ou modifient quelles données internes pour le logiciel [https://phabricator.wikimedia.org/diffusion/EMWF/ MediaWikiFarm], une "extension" MediaWiki pour gérer des fermes de wikis. Ceci représente la classe [https://phabricator.wikimedia.org/diffusion/EMWF/browse/master/src/MediaWikiFarm.php MediaWikiFarm] qui se trouve être la classe principale contenant presque toute la logique. Chaque ligne est une méthode (grossièrement ordonnées par ordre chronologique lors d’une exécution classique) et chaque colonne est une des propriétés de la classe (toutes sont protégées). Dans chaque cellule, il y a soit : * {{read}} : la propriété est (seulement) lue par la méthode ; * {{set}} : la propriété est modifiée par la méthode (et possiblement lue) ; * {{-}} : la propriété n’est ni lue ni modifiée par la méthode. Dans mes précédents <s>jeux</s> travaux sur l’analyse statique de ce logiciel, j’avais créé [[:mw:File:Call graph of extension MediaWikiFarm.svg|le graphe d’appels]] à l’aide d’un programme externe. Mais, pour être exact, ce graphe d’appels n’est qu’[[:wikipedia:Call graph|une sur-estimation]] puisque le graphe d’appels (dynamique) est un sous-ensemble de celui-ci : lors d’une exécution, certains chemins peuvent ne pas être exécutés en fonction du contexte. Ici, nous avons le "graphe des données" et il y a différents contextes : en haut à gauche, vous pouvez choisir les différents contextes principaux dans lesquels le programme peut s’exécuter. Cela dépend principalement de l’environnement et de la configuration, et les possibilités listées ici ne sont que les principales. Le principal résultat obtenu grâce à cette représentation est : « le cache diminue drastiquement le traitement ». En fait, cela n’est pas une surprise, le programme a été conçu dans ce but, mais une telle matrice creuse est encourageante et aide à visualiser les inter-relations. Lors de tests de performance, une exécution sans cache prend 10-15 millisecondes, et une exécution avec cache prend 85 microsecondes (environ 130 fois moins). bf2aa666c53ae8b202bfd67cd91193b7ac541b5a 575 574 2016-11-21T08:39:58Z Seb35 1 mistake in getMediaWikiConfig wikitext text/x-wiki ([[#Explanations (English)|explanation below]] - [[#Explications (français)|explications ci-dessous)]] {| class="wikitable" |- ! rowspan="3" colspan="2" | Time ↧<br /><span style="font-weight:normal;"> <span id="link-mode-monoversion">Monoversion</span> / <span id="link-mode-multiversion" class="link-selected">Multiversion</span><br /> <span id="link-cache-no">No cache</span> / <span id="link-cache-empty" class="link-selected">Empty</span> / <span id="link-cache-loaded">Loaded</span><br /> <span id="link-deployment-with" class="link-selected">With</span> / <span id="link-deployment-without">Without</span> deployment file<br /> <span id="link-env-web" class="link-selected">Web</span> / <span id="link-env-cli">CLI</span> / <span id="link-env-update">update</span><br /> <span id="link-all">(All)</span> - As of [https://phabricator.wikimedia.org/rEMWF1b151729d9eee8feae601c6b0fc20469c8b86117 1b15172] </span> ! colspan="16" | Properties ! colspan="9" | Files |- | rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | farmDir | rowspan="2" style="transform:rotate(-90deg) translate(-1.3em); max-width:2.4em; width:2.4em;" | configDir | rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | codeDir | rowspan="2" style="transform:rotate(-90deg) translate(-1.15em); max-width:2.4em; width:2.4em;" | cacheDir | colspan="2" style="text-align:center;" | params | colspan="4" style="text-align:center;" | farmConfig | colspan="3" style="text-align:center;" | variables | colspan="3" style="text-align:center;" | configuration | rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | farms.yml | rowspan="2" style="transform:rotate(-90deg) translate(-2.2em); max-width:2.4em; width:2.4em;" | variable.yml | rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | config.yml | rowspan="2" style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | versions.yml | rowspan="2" style="transform:rotate(-90deg) translate(-3.3em); max-width:2.4em; width:2.4em;" | deployments.php | rowspan="2" style="transform:rotate(-90deg) translate(-4.0em); max-width:2.4em; width:2.4em;" | (cache)&nbsp;versions.php | rowspan="2" style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | (cache)&nbsp;config.php | rowspan="2" style="transform:rotate(-90deg) translate(-5.4em); max-width:2.4em; width:2.4em; height:13.5em;" | (cache)&nbsp;LocalSettings.php | rowspan="2" style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em; height:13.5em;" | main.php |- | style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em;" | 'EntryPoint' | style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em; height:10em;" | 'ExtensionRegistry' | style="transform:rotate(-90deg) translate(-1.0em); max-width:2.4em; width:2.4em;" | 'variables' | style="transform:rotate(-90deg) translate(-2.0em); max-width:2.4em; width:2.4em;" | 'coreconfig' | style="transform:rotate(-90deg) translate(-0.1em); max-width:2.4em; width:2.4em;" | 'config' | style="transform:rotate(-90deg) translate( 0.3em); max-width:2.4em; width:2.4em;" | Other | style="transform:rotate(-90deg) translate(-1.2em); max-width:2.4em; width:2.4em;" | '$CODE' | style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | '$VERSION' | style="transform:rotate(-90deg) translate(-0.5em); max-width:2.4em; width:2.4em;" | Other | style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | 'settings'&nbsp;/&nbsp;'arrays' | style="transform:rotate(-90deg) translate(-3.8em); max-width:2.4em; width:2.4em;" | 'extensions'&nbsp;/&nbsp;'skins' | style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | 'execFiles' |- | rowspan="11" style="transform:rotate(-90deg) translate(-1.4em); max-width:1.5em;" | Existence | <code>load</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>__construct</code> | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | {{set}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{set}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{set}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>selectFarm</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>checkExistence</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>checkHostVariables</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>setVersion</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&#x7c;&nbsp;↳</span> <code>setOtherVariables</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>getConfigFile</code> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>setVariable</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>updateVersionAfterMaintenance</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>updateVersion</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{read}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="mode-default-hide show-when-mode-multiversion">{{read}}</span><span class="mode-default-show hide-when-mode-multiversion void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{set}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | rowspan="6" style="transform:rotate(-90deg) translate(-2.5em); max-width:1.5em;" | Configuration | <code>loadMediaWikiConfig</code> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">↳</span> <code>getMediaWikiConfig</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;↳</span> <code>populateSettings</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;↳</span> <code>extractSkinsAndExtensions</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;&#x7c;&nbsp;&nbsp;↳</span> <code>detectLoadingMechanism</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <span style="font-family:monospace;">&nbsp;&nbsp;↳</span> <code>createLocalSettings</code> | style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | rowspan="4" style="transform:rotate(-90deg) translate(-0.55em); max-width:1.5em;" | Utility | <code>isLocalSettingsFresh</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-empty hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>replaceVariable</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>readFile</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{read}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | <code>cacheFile</code> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span> | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} |- | colspan="2" | (MediaWiki) | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | {{-}} | style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span> | style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span> |} == Explanations (English) == This is a hand-made matrix describing what function read or modify what internal data for the software [https://phabricator.wikimedia.org/diffusion/EMWF/ MediaWikiFarm], a MediaWiki "extension" to manage MediaWiki farms of wikis. This represents the class [https://phabricator.wikimedia.org/diffusion/EMWF/browse/master/src/MediaWikiFarm.php MediaWikiFarm], which is the main class containing almost all logic. Each row is a method (roughly sorted by chronological order in a typical run) and each column is a class property (all are protected). In each cell, there is either: * {{read}}: the property is (only) read in the method; * {{set}}: the property is set in the method (and possibly read); * {{-}}: the property is neither read or set in the method. In my previous <s>games</s> works on static analysis of this software, I created [[:mw:File:Call graph of extension MediaWikiFarm.svg|the call graph]] with an external software. But, to be more exact, this call graph is only [[:wikipedia:Call graph|an overapproximation]] since the exact (dynamic) call graph is a subset of this one: in a run, possibly some paths are not executed since it depends on the context. Here, this is the "data graph", and there are different contexts: on the top left, you can choose the various main contexts in which the software can run. This depends mainly from the environment and the configuration, and the possibilities listed here are only the main ones. The main result coming from this representation is: "the cache drastically reduces the processing". In fact this is not a surprise, it was designed for it, but such a sparse matrix is encouraging and help to visualise the inter-relations. When benchmarking the software, a no-cache run takes 10-15 milliseconds, and a with-cache run takes 85 microseconds (roughly 130 times less). == Explications (français) == Ceci est une matrice créée à la main qui décrit quels fonctions lisent ou modifient quelles données internes pour le logiciel [https://phabricator.wikimedia.org/diffusion/EMWF/ MediaWikiFarm], une "extension" MediaWiki pour gérer des fermes de wikis. Ceci représente la classe [https://phabricator.wikimedia.org/diffusion/EMWF/browse/master/src/MediaWikiFarm.php MediaWikiFarm] qui se trouve être la classe principale contenant presque toute la logique. Chaque ligne est une méthode (grossièrement ordonnées par ordre chronologique lors d’une exécution classique) et chaque colonne est une des propriétés de la classe (toutes sont protégées). Dans chaque cellule, il y a soit : * {{read}} : la propriété est (seulement) lue par la méthode ; * {{set}} : la propriété est modifiée par la méthode (et possiblement lue) ; * {{-}} : la propriété n’est ni lue ni modifiée par la méthode. Dans mes précédents <s>jeux</s> travaux sur l’analyse statique de ce logiciel, j’avais créé [[:mw:File:Call graph of extension MediaWikiFarm.svg|le graphe d’appels]] à l’aide d’un programme externe. Mais, pour être exact, ce graphe d’appels n’est qu’[[:wikipedia:Call graph|une sur-estimation]] puisque le graphe d’appels (dynamique) est un sous-ensemble de celui-ci : lors d’une exécution, certains chemins peuvent ne pas être exécutés en fonction du contexte. Ici, nous avons le "graphe des données" et il y a différents contextes : en haut à gauche, vous pouvez choisir les différents contextes principaux dans lesquels le programme peut s’exécuter. Cela dépend principalement de l’environnement et de la configuration, et les possibilités listées ici ne sont que les principales. Le principal résultat obtenu grâce à cette représentation est : « le cache diminue drastiquement le traitement ». En fait, cela n’est pas une surprise, le programme a été conçu dans ce but, mais une telle matrice creuse est encourageante et aide à visualiser les inter-relations. Lors de tests de performance, une exécution sans cache prend 10-15 millisecondes, et une exécution avec cache prend 85 microsecondes (environ 130 fois moins). 0252258c7ab510380860f6719633a62ad98c082e MediaWiki:Common.js 8 163 567 2016-11-20T21:03:36Z Seb35 1 +js spécifique à [[MediaWikiFarm static analysis]] javascript text/javascript /* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */ $( function() { if( $( '.page-MediaWikiFarm_static_analysis' ).length == 0 ) return; var families = {}, listfamilies = [], all = false, changeLink = function(family, value) { if( all ) return; var result = ''; families[family].forEach( function(v) { if( v != value ) { $('#link-' + family + '-' + v).removeClass('link-selected').css('font-weight', 'normal'); } else { $('#link-' + family + '-' + value).addClass('link-selected').css('font-weight', 'bold'); } } ); $('#css-'+family).text( '.' + family + '-default-hide { display: none; } ' + '.' + family + '-default-show { display: inline; } ' + '.hide-when-' + family + '-' + value + ' { display: none; } ' + '.show-when-' + family + '-' + value + ' { display: inline; } ' + '.' + family + '-' + value + ' { display: inline; }' ); }; $( '#mw-content-text table th span#link-all').wrapInner( '<a id="thelink-all"></a>' ); $( '#thelink-all').click( function() { if( !all ) { listfamilies.forEach( function(family) { families[family].forEach( function(v) { $('#link-' + family + '-' + v).css('font-weight', 'bold'); $('#css-'+family).text( '.' + family + '-default-hide, ' + '.' + family + '-default-show, ' + '.hide-when-' + family + '-' + v + ', ' + '.show-when-' + family + '-' + v + ', ' + '.' + family + '-' + v + ' { display: inline; }' + '.void { display: none; }' ); } ); } ); $(this).text('(Reset)'); all = true; } else { window.location.reload(); all = false; } } ); $( '#mw-content-text table th span' ).each( function() { if( $(this).attr('id') && $(this).attr('id').match( /^link-/ ) ) { var result = $(this).attr('id').match( /^link-([a-z]+)-([a-z]+)$/ ); if( !families[result[1]] ) families[result[1]] = []; listfamilies.push( result[1] ); families[result[1]].push( result[2] ); if( $('#css-' + result[1]).length == 0 ) { $('head').append( '<style id="css-' + result[1] + '" type="text/css"></style>' ); } $(this).wrapInner( '<a id="thelink-' + result[1] + '-' + result[2] + '"></a>' ); $('#thelink-' + result[1] + '-' + result[2]).click( function() { changeLink( result[1], result[2] ); return false; } ); if( $(this).hasClass('link-selected') ) { changeLink( result[1], result[2] ); } } } ); } ); da823b715d0c308ce9fcf6c19a46da2375b0eaa2 Modèle:Read 10 164 568 2016-11-20T21:04:11Z Seb35 1 Page créée avec « <span style="color:green;">read</span> » wikitext text/x-wiki <span style="color:green;">read</span> 61fea418d6bd9eb850f4b6ef347e1e0dcae66544 Modèle:Set 10 165 569 2016-11-20T21:04:46Z Seb35 1 Page créée avec « <span style="color:green;">read</span> » wikitext text/x-wiki <span style="color:green;">read</span> 61fea418d6bd9eb850f4b6ef347e1e0dcae66544 571 569 2016-11-20T21:06:17Z Seb35 1 wikitext text/x-wiki <span style="color:red;">set</span> d93f10383be06df62e1ca2d08f1ae4df0517b7db Modèle:- 10 166 570 2016-11-20T21:04:49Z Seb35 1 Page créée avec « <span style="color:#aaa;">-</span> » wikitext text/x-wiki <span style="color:#aaa;">-</span> e2060131ebe803e73ac519016d7e64689b073176 MediaWiki:Common.css 8 4 572 451 2016-11-20T21:08:23Z Seb35 1 css text/css /* Contenu en couleur noire et non grise */ div#content { color: black; } a:not([href]) { cursor: pointer; } /* Code en couleur grise */ pre, code, tt, kbd, samp, .mw-code { color: #252525; } /* Espace de noms Présentation avec un style « diapositives » */ .ns-104.action-view { background: white; height: 95%; } .ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub { display: none; } .ns-104.action-view #content { width: 90%; height: 95%; margin: 1% auto; padding: 1em; border: 1px solid #A7D7F9; } .ns-104.action-view #bodyContent { height: 95%; } .ns-104.action-view #mw-content-text { height: 95%; } .ns-104 .mw-body-content { font-size: 0.975em; } .ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 { border-bottom: 0px; } .ns-104 .presentation-bar { font-size: 80%; } .ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right { position: fixed; bottom: 3%; } .ns-104 #presentation-bar-left { left: 5% } .ns-104 #presentation-bar-right { right: 5%; } .ns-104 .presentation-purge, .ns-104 .presentation-move { display: none; } /* Spécifique à la présentation sur les wikis */ .ns-104 .mw-body .external { background: none; padding-right: 0px; } .ns-104 .mw-body a, .ns-104 .mw-body a:active, .ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active, .ns-104 .mw-body .external, .ns-104 .mw-body .external:active { color: black; border-bottom: 1px dotted black; } .ns-104 .mw-body a:hover, .ns-104 .mw-body a.extiw:hover, .ns-104 .mw-body .external:hover { border-bottom: 1px dotted black; } .ns-104 ul, .ns-104 ol { line-height: 2em; } d31683dcac39f0f883b3c32832043949251ce5fc Utilisateur:Seb35 2 167 576 2016-12-03T11:53:32Z Seb35 1 présentation wikitext text/x-wiki Ce wiki me sert de petite base de connaissances, aussi je suis le principal contributeur, mais il est ouvert à l’édition pour qui veut. J’y met des travaux en cours, des brouillons, etc. [[Utilisateur:Seb35|Seb35]] ([[Discussion utilisateur:Seb35|discussion]]) 3 décembre 2016 à 12:53 (CET) 3e3fe01cbf05b4aa8cf22715367236f1882c5e1b Kubernetes 0 174 586 2017-01-22T09:05:37Z Seb35 1 Page créée avec « Quelques notes pour tester Kubernetes == Liens == * [https://kubernetes.io Site principal + documentation] * [https://github.com/kubernetes/kubernetes GitHub Kubernetes]... » wikitext text/x-wiki Quelques notes pour tester Kubernetes == Liens == * [https://kubernetes.io Site principal + documentation] * [https://github.com/kubernetes/kubernetes GitHub Kubernetes] * [https://www.docker.com/products/docker-engine Docker] (container engine) * [https://github.com/coreos/rkt GitHub rkt] (container engine) * [https://coreos.com/blog/rkt-and-kubernetes.html Blog post about rkt] (déc. 2016) == Installation sur Debian Jessie == # Installer Docker [https://docs.docker.com/engine/installation/linux/debian/] #: <code>apt-get install curl apt-transport-https</code> #: <code>curl -fsSL https://yum.dockerproject.org/gpg | apt-key add -</code> #: <code>echo 'deb https://apt.dockerproject.org/repo/ debian-jessie main' > /etc/apt/sources.list.d/docker.list</code> #: <code>apt-get update</code> #: <code>apt-get install docker-engine</code> # Installer Kubernetes [https://kubernetes.io/docs/getting-started-guides/kubeadm/] #: <code>curl -fsSL https://apt.kubernetes.io/doc/apt-key.gpg | apt-key add -</code> #: <code>deb http://apt.kubernetes.io/ kubernetes-xenial main' > /etc/apt/sources.list.d/kubernetes.list</code> #: <code>apt-get update</code> #: <code>apt-get install kubelet kubectl kubernetes-cni</code> 15e4b9a6b25373f4575050c81ba70c291fc5f4de 587 586 2017-01-22T14:08:52Z Seb35 1 +expérience d’un test sur un cluster CentOS sur Gandi wikitext text/x-wiki Quelques notes pour tester Kubernetes == Liens == * [https://kubernetes.io Site principal + documentation] * [https://github.com/kubernetes/kubernetes GitHub Kubernetes] * [https://www.docker.com/products/docker-engine Docker] (container engine) * [https://github.com/coreos/rkt GitHub rkt] (container engine) * [https://coreos.com/blog/rkt-and-kubernetes.html Blog post about rkt] (déc. 2016) == Installation sur Debian Jessie == # Installer Docker [https://docs.docker.com/engine/installation/linux/debian/] #: <code>apt-get install curl apt-transport-https</code> #: <code>curl -fsSL https://yum.dockerproject.org/gpg | apt-key add -</code> #: <code>echo 'deb https://apt.dockerproject.org/repo/ debian-jessie main' > /etc/apt/sources.list.d/docker.list</code> #: <code>apt-get update</code> #: <code>apt-get install docker-engine</code> # Installer Kubernetes [https://kubernetes.io/docs/getting-started-guides/kubeadm/] #: <code>curl -fsSL https://apt.kubernetes.io/doc/apt-key.gpg | apt-key add -</code> #: <code>deb http://apt.kubernetes.io/ kubernetes-xenial main' > /etc/apt/sources.list.d/kubernetes.list</code> #: <code>apt-get update</code> #: <code>apt-get install kubelet kubectl kubernetes-cni</code> == Installation d’un cluster de test CentOS sur Gandi == https://kubernetes.io/docs/getting-started-guides/fedora/fedora_ansible_config/ * Créé 3 VM sous CentOS 7 authentifiés par clé SSH avec une IPv4 * Sur chacune des VM : ** <code>yum update</code> ** <code>yum install net-tools/code> (pour ifconfig) * Sur le master : ** <code>yum install epel-release</code> (pour installer ansible) ** <code>yum update</code> ** <code>yum install ansible git python-netaddr</code> ** <code>git clone https://github.com/kubernetes/contrib.git</code> ** <code>cd contrib/ansible</code> ** <code>cp inventory/localhost.ini inventory/inventory</code> ** <code>vi inventory/inventory</code> : remplacer tous les "localhost" par les noms des machines (leur reverse DNS peut être trouvé sur l’interface de Gandi en cliquant sur le détail des interfaces publiques) – ne pas laisser "localhost" dans la section "etcd" sinon les nodes se réferreront à localhost pour récupérer leur conf etc (qui bien sûr n’existe pas sur localhost) ** <code>cd scripts</code> ** <code>./deploy-cluster.sh</code> 2c5178a2de316c3c0bcf7bbb6a02c0134e8a541d 588 587 2017-01-22T15:55:37Z Seb35 1 wikitext text/x-wiki Quelques notes pour tester Kubernetes == Liens == * [https://kubernetes.io Site principal + documentation] * [https://github.com/kubernetes/kubernetes GitHub Kubernetes] * [https://www.docker.com/products/docker-engine Docker] (container engine) * [https://github.com/coreos/rkt GitHub rkt] (container engine) * [https://coreos.com/blog/rkt-and-kubernetes.html Blog post about rkt] (déc. 2016) == Installation sur Debian Jessie == # Installer Docker [https://docs.docker.com/engine/installation/linux/debian/] #: <code>apt-get install curl apt-transport-https</code> #: <code>curl -fsSL https://yum.dockerproject.org/gpg | apt-key add -</code> #: <code>echo 'deb https://apt.dockerproject.org/repo/ debian-jessie main' > /etc/apt/sources.list.d/docker.list</code> #: <code>apt-get update</code> #: <code>apt-get install docker-engine</code> # Installer Kubernetes [https://kubernetes.io/docs/getting-started-guides/kubeadm/] #: <code>curl -fsSL https://apt.kubernetes.io/doc/apt-key.gpg | apt-key add -</code> #: <code>deb http://apt.kubernetes.io/ kubernetes-xenial main' > /etc/apt/sources.list.d/kubernetes.list</code> #: <code>apt-get update</code> #: <code>apt-get install kubelet kubectl kubernetes-cni</code> == Installation d’un cluster de test CentOS sur Gandi == https://kubernetes.io/docs/getting-started-guides/fedora/fedora_ansible_config/ * Créé 3 VM sous CentOS 7 authentifiés par clé SSH avec une IPv4 * Sur chacune des VM : ** <code>yum update</code> ** <code>yum install net-tools</code> (pour ifconfig) * Sur le master : ** <code>yum install epel-release</code> (pour installer ansible) ** <code>yum update</code> ** <code>yum install ansible git python-netaddr</code> ** <code>git clone https://github.com/kubernetes/contrib.git</code> ** <code>cd contrib/ansible</code> ** <code>cp inventory/localhost.ini inventory/inventory</code> ** <code>vi inventory/inventory</code> : remplacer tous les "localhost" par les noms des machines (leur reverse DNS peut être trouvé sur l’interface de Gandi en cliquant sur le détail des interfaces publiques) – ne pas laisser "localhost" dans la section "etcd" sinon les nodes se réferreront à localhost pour récupérer leur conf etc (qui bien sûr n’existe pas sur localhost) ** <code>cd scripts</code> ** <code>./deploy-cluster.sh</code> 24dad333ed307a08f98f9f572b1a7b9fab3a176c 589 588 2017-01-22T16:02:26Z Seb35 1 /* Installation d’un cluster de test CentOS sur Gandi */ wikitext text/x-wiki Quelques notes pour tester Kubernetes == Liens == * [https://kubernetes.io Site principal + documentation] * [https://github.com/kubernetes/kubernetes GitHub Kubernetes] * [https://www.docker.com/products/docker-engine Docker] (container engine) * [https://github.com/coreos/rkt GitHub rkt] (container engine) * [https://coreos.com/blog/rkt-and-kubernetes.html Blog post about rkt] (déc. 2016) == Installation sur Debian Jessie == # Installer Docker [https://docs.docker.com/engine/installation/linux/debian/] #: <code>apt-get install curl apt-transport-https</code> #: <code>curl -fsSL https://yum.dockerproject.org/gpg | apt-key add -</code> #: <code>echo 'deb https://apt.dockerproject.org/repo/ debian-jessie main' > /etc/apt/sources.list.d/docker.list</code> #: <code>apt-get update</code> #: <code>apt-get install docker-engine</code> # Installer Kubernetes [https://kubernetes.io/docs/getting-started-guides/kubeadm/] #: <code>curl -fsSL https://apt.kubernetes.io/doc/apt-key.gpg | apt-key add -</code> #: <code>deb http://apt.kubernetes.io/ kubernetes-xenial main' > /etc/apt/sources.list.d/kubernetes.list</code> #: <code>apt-get update</code> #: <code>apt-get install kubelet kubectl kubernetes-cni</code> == Installation d’un cluster de test CentOS sur Gandi == https://kubernetes.io/docs/getting-started-guides/fedora/fedora_ansible_config/ * Créé 3 VM sous CentOS 7 authentifiés par clé SSH avec une IPv4 * Sur chacune des VM : ** <code>yum update</code> ** <code>yum install net-tools</code> (pour ifconfig) * Sur le master : ** <code>yum install epel-release</code> (pour installer ansible) ** <code>yum update</code> ** <code>yum install ansible git python-netaddr</code> ** <code>git clone https://github.com/kubernetes/contrib.git</code> ** <code>cd contrib/ansible</code> ** <code>cp inventory/localhost.ini inventory/inventory</code> ** <code>vi inventory/inventory</code> : remplacer tous les "localhost" par les noms des machines (leur reverse DNS peut être trouvé sur l’interface de Gandi en cliquant sur le détail des interfaces publiques) – ne pas laisser "localhost" dans la section "etcd" sinon les nodes se réferreront à localhost pour récupérer leur conf etc (qui bien sûr n’existe pas sur localhost) ** <code>cd scripts</code> ** <code>./deploy-cluster.sh</code> Finalement, la commande <code>kubectl get nodes</code> sur le master est censée donner les deux nœuds, mais me répond avec succès (exit code 0) une liste vide. En revanche <code>systemctl | grep -i kube</code> et <code>iptables -nvL</code> me donnent des résultats censés. En fait, je n’ai pas fait la procédure décrite ci-dessus en une seule fois, aussi il est possible que le problème vienne de là, à réessayer proprement donc. 04b29036fc50c21baa6da04026d71cb5ad2863c8 Tutorial:Beautiful MediaWiki URLs 102 178 4235 3416 2017-08-10T15:57:46Z Seb35 1 revert spam wikitext text/x-wiki {{Tutorial|lang=en|status=stable}} This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit] ''instead of'' :[{{SERVER}}/index.php?title={{FULLPAGENAMEE}}&action=edit http://{{SERVERNAME}}/index.php?title={{FULLPAGENAMEE}}&action=edit] </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :[{{SERVER}}/维基百科?action=history http://{{SERVERNAME}}/维基百科?action=history] ''instead of'' :[{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history http://{{SERVERNAME}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history] </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :) g. An easier way to remove most of the index.php is to use [[:mw:Manual:$wgActionPaths|$wgActionPaths]]. With this configuration setting, the 'edit' action on this page would be <tt>[{{SERVER}}/edit/{{FULLPAGENAMEE}} http://{{SERVERNAME}}/edit/{{FULLPAGENAMEE}}]</tt> instead of <tt>[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit]</tt>. I have no opinion on what is better. It can be kept in mind that some browsers might remove the address part after the "?"; in these browsers, the action would or would not be displayed. Note : how does MediaWiki react with $wgActionPaths when there are (e.g.) "action=edit" and "section=0": is it "/edit/Title?section=0" or "/index.php?title=Title&action=edit&section=0"? == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital). # Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. 03570137c0bdf1de0f81eeba154fcb9ac854b005 4236 4235 2017-08-10T15:58:31Z Seb35 1 A protégé « [[Tutorial:Beautiful MediaWiki URLs]] » : Pourriels ([Modifier=Autoriser uniquement les utilisateurs auto-confirmés] (infini) [Renommer=Autoriser uniquement les utilisateurs auto-confirmés] (infini)) wikitext text/x-wiki {{Tutorial|lang=en|status=stable}} This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit] ''instead of'' :[{{SERVER}}/index.php?title={{FULLPAGENAMEE}}&action=edit http://{{SERVERNAME}}/index.php?title={{FULLPAGENAMEE}}&action=edit] </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :[{{SERVER}}/维基百科?action=history http://{{SERVERNAME}}/维基百科?action=history] ''instead of'' :[{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history http://{{SERVERNAME}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history] </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :) g. An easier way to remove most of the index.php is to use [[:mw:Manual:$wgActionPaths|$wgActionPaths]]. With this configuration setting, the 'edit' action on this page would be <tt>[{{SERVER}}/edit/{{FULLPAGENAMEE}} http://{{SERVERNAME}}/edit/{{FULLPAGENAMEE}}]</tt> instead of <tt>[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit]</tt>. I have no opinion on what is better. It can be kept in mind that some browsers might remove the address part after the "?"; in these browsers, the action would or would not be displayed. Note : how does MediaWiki react with $wgActionPaths when there are (e.g.) "action=edit" and "section=0": is it "/edit/Title?section=0" or "/index.php?title=Title&action=edit&section=0"? == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital). # Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. 03570137c0bdf1de0f81eeba154fcb9ac854b005 Modèle:Tutorial 10 20 4237 86 2017-08-28T21:52:43Z 80.23.199.34 0 wikitext text/x-wiki Nice post. I study one thing more difficult on completely different blogs everyday. fbgaedfceebcdkda e4d6b684703c39190b7ed8ee3d2b5f03d890fab1 4238 4237 2017-09-04T21:55:29Z 95.46.126.3 0 wikitext text/x-wiki The principle isn't to artificially turn out to be effective, cfdfekbebdcdfdda db61d487c9255c0c96179f7be82cad5700b04117 4239 4238 2017-09-08T22:29:15Z 212.233.61.70 0 wikitext text/x-wiki This actually answered my drawback, thank you! kbgkkdcdcfdagdca 6ed158757689c6e9f0adc02d7fbe6df488ddd66a 4240 4239 2017-09-13T07:16:59Z 95.46.126.3 0 wikitext text/x-wiki reverse lookup cell phone free christian louboutin shoes you are dcfedgdddgeacgea 8703c703a1798a506d0fc6e9ed1bc2ba5170cfcb 658076 4240 2020-03-07T16:44:04Z Seb35 1 revert wikitext text/x-wiki <div style="top:0px; right:0px; float:right; z-index:0; background-color:white; border:1px solid black; padding: 0px 10px;"> Langue : {{#switch:{{lc:{{{lang|fr}}}}}|fr|en={{lc:{{{lang|fr}}}}}|#default=inconnue}}<br /> Statut : {{#switch:{{lc:{{{status|stable}}}}}|stable=stable|draft|brouillon=brouillon|#default=inconnu}} </div> <includeonly>[[Catégorie:{{#switch:{{lc:{{{lang|fr}}}}}|fr|en={{lc:{{{lang|fr}}}}}|#default=Langue inconnue}}]] [[Catégorie:{{#switch:{{lc:{{{status|stable}}}}}|stable=Stable|draft|brouillon=Brouillon|#default=Statut inconnu}}]]</includeonly> 74b931e6dbb079e73ba71c22d5376031210c342f Btrfs 0 189 167788 2019-02-02T16:52:10Z Seb35 1 begin of notes about btrfs wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, unsuccessfully for now. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. == Create the server == On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS. Update the packages: apt update && apt upgrade -y On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server. == Convert to btrfs == The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs. Install dependencies: apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev libext2fs-dev pkg-config python3-dev python3-setuptools Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]): wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz tar xfz btrfs-progs-v4.20.1.tar.gz cd btrfs-progs-v4.20.1 ./configure --with-convert=ext2 make make install cd .. rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz eaabd272b90b424ace3d67d42a26d433b27fe740 167796 167788 2019-02-02T17:12:49Z Seb35 1 wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, unsuccessfully for now. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. == Create the server == On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS. Update the packages: apt update && apt upgrade -y On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs. Install dependencies: apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev libext2fs-dev pkg-config python3-dev python3-setuptools Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]): wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz tar xfz btrfs-progs-v4.20.1.tar.gz cd btrfs-progs-v4.20.1 ./configure --with-convert=ext2 make make install cd .. rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid -o value -s TYPE /dev/xvda1 # and the same for others Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: fsck.ext4 -f /dev/xvdb1 btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvda1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123], it can be worked around: btrfs-convert -d -p /dev/xvdb1 Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved == Promote as root filesystem == Not successful after a first try with [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions] and I abandonned here, see also [https://wiki.gentoo.org/wiki/Btrfs/System_Root_Guide]. 473c2bb95e1b1582f3e0445c10f819d1628b2347 167802 167796 2019-02-02T17:16:52Z Seb35 1 ref wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, unsuccessfully for now. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. == Create the server == On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS. Update the packages: apt update && apt upgrade -y On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs. Install dependencies: apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev libext2fs-dev pkg-config python3-dev python3-setuptools Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]): wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz tar xfz btrfs-progs-v4.20.1.tar.gz cd btrfs-progs-v4.20.1 ./configure --with-convert=ext2 make make install cd .. rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid -o value -s TYPE /dev/xvda1 # and the same for others Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: fsck.ext4 -f /dev/xvdb1 btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvda1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: btrfs-convert -d -p /dev/xvdb1 Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved == Promote as root filesystem == Not successful after a first try with [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions] and I abandonned here, see also [https://wiki.gentoo.org/wiki/Btrfs/System_Root_Guide]. 389e0fd332f4d9afe8b2f03dca2e2c265aa62b5e 171893 167802 2019-02-08T08:46:02Z Seb35 1 slightly different for Debian 9, added other steps if unsucessful wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, unsuccessfully for now. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. == Create the server == On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9. Update the packages: apt update && apt upgrade -y On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs. Install dependencies (''Ubuntu 18.04 LTS''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev OR Install dependencies (''Debian 9''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]): wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz tar xfz btrfs-progs-v4.20.1.tar.gz cd btrfs-progs-v4.20.1 ./configure --with-convert=ext2 make make install cd .. rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid -o value -s TYPE /dev/xvda1 # and the same for others Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: fsck.ext4 -f /dev/xvdb1 btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvda1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved == Promote as root filesystem == Not successful after a first try with [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions] and I abandonned here, see also [https://wiki.gentoo.org/wiki/Btrfs/System_Root_Guide]. 07ef96f089c1bb57e4e163756165d1d3067a89d4 171901 171893 2019-02-08T08:59:19Z Seb35 1 +time spent, +defrag after conversion wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, unsuccessfully for now. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. == Create the server == On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9. Update the packages: apt update && apt upgrade -y On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs. Install dependencies (''Ubuntu 18.04 LTS''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev OR Install dependencies (''Debian 9''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]): wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz tar xfz btrfs-progs-v4.20.1.tar.gz cd btrfs-progs-v4.20.1 ./configure --with-convert=ext2 make make install cd .. rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid -o value -s TYPE /dev/xvda1 # and the same for others Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: fsck.ext4 -f /dev/xvdb1 btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvda1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt == Promote as root filesystem == Not successful after a first try with [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions] and I abandonned here, see also [https://wiki.gentoo.org/wiki/Btrfs/System_Root_Guide]. a31dc4e1d62ec79a3044d5319d6fbd5ef4b34610 171906 171901 2019-02-08T09:16:38Z Seb35 1 +manpage wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, unsuccessfully for now. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. == Create the server == On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9. Update the packages: apt update && apt upgrade -y On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs. Install dependencies (''Ubuntu 18.04 LTS''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev OR Install dependencies (''Debian 9''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]): wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz tar xfz btrfs-progs-v4.20.1.tar.gz cd btrfs-progs-v4.20.1 ./configure --with-convert=ext2 make make install cd .. rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid -o value -s TYPE /dev/xvda1 # and the same for others Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvda1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt == Promote as root filesystem == Not successful after a first try with [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions] and I abandonned here, see also [https://wiki.gentoo.org/wiki/Btrfs/System_Root_Guide]. 47ad9e0059379c8c0136ce435863095ba2b561dc 172161 171906 2019-02-08T17:12:00Z Seb35 1 successful wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. == Create the server == On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9. Update the packages: apt update && apt upgrade -y On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs. Install dependencies (''Ubuntu 18.04 LTS''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev OR Install dependencies (''Debian 9''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]): wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz tar xfz btrfs-progs-v4.20.1.tar.gz cd btrfs-progs-v4.20.1 ./configure --with-convert=ext2 make make install cd .. rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid -o value -s TYPE /dev/xvda1 # and the same for others Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvda1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys ; do mount --bind /$i /mnt/$i ; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) vi /etc/grub.d/00_header Comment the line: #if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi Update grub: grub-install /dev/xvdb update-grub Quit: exit exit == Define the cooked disk as boot disk == In Gandi V4 interface, stop the server, select the cooked disk as boot disk of this server (or detach the cooked disk and attach it as boot disk on another server). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / 715619d29dd9afe766743360472f88d2dd97cf0f 172163 172161 2019-02-08T17:13:58Z Seb35 1 /* Promote as root filesystem */ wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. == Create the server == On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9. Update the packages: apt update && apt upgrade -y On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs. Install dependencies (''Ubuntu 18.04 LTS''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev OR Install dependencies (''Debian 9''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]): wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz tar xfz btrfs-progs-v4.20.1.tar.gz cd btrfs-progs-v4.20.1 ./configure --with-convert=ext2 make make install cd .. rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid -o value -s TYPE /dev/xvda1 # and the same for others Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvda1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) vi /etc/grub.d/00_header Comment the line: #if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi Update grub: grub-install /dev/xvdb update-grub Quit: exit for i in dev dev/pts proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V4 interface, stop the server, select the cooked disk as boot disk of this server (or detach the cooked disk and attach it as boot disk on another server). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / 02d37aa6b1493e6805ef698228e032c18ae9c373 172181 172163 2019-02-08T17:48:40Z Seb35 1 /* Define the cooked disk as boot disk */ wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. == Create the server == On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9. Update the packages: apt update && apt upgrade -y On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs. Install dependencies (''Ubuntu 18.04 LTS''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev OR Install dependencies (''Debian 9''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]): wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz tar xfz btrfs-progs-v4.20.1.tar.gz cd btrfs-progs-v4.20.1 ./configure --with-convert=ext2 make make install cd .. rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid -o value -s TYPE /dev/xvda1 # and the same for others Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvda1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) vi /etc/grub.d/00_header Comment the line: #if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi Update grub: grub-install /dev/xvdb update-grub Quit: exit for i in dev dev/pts proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V4 interface, stop the server, select the cooked disk as boot disk of this server (or detach the cooked disk and attach it as boot disk on another server). Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / 085fd7183c465a1847bf42e718c2d2e80e3c1ad3 429813 172181 2019-09-11T21:49:51Z Seb35 1 /* Convert to btrfs */ update: btrfs-convert is included in recent Debian wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. == Create the server == On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9. Update the packages: apt update && apt upgrade -y On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs. Update: btrfs-convert is included in Debian 10 buster backports and in Debian 11 bullseye. Install dependencies (''Ubuntu 18.04 LTS''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev OR Install dependencies (''Debian 9''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]): wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz tar xfz btrfs-progs-v4.20.1.tar.gz cd btrfs-progs-v4.20.1 ./configure --with-convert=ext2 make make install cd .. rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid -o value -s TYPE /dev/xvda1 # and the same for others Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvda1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) vi /etc/grub.d/00_header Comment the line: #if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi Update grub: grub-install /dev/xvdb update-grub Quit: exit for i in dev dev/pts proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V4 interface, stop the server, select the cooked disk as boot disk of this server (or detach the cooked disk and attach it as boot disk on another server). Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / a532f72be33ef675185112a900642e2aea573faa 658077 429813 2020-09-21T13:02:14Z Seb35 1 detail wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. == Create the server == On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9. Update the packages: apt update && apt upgrade -y On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs. Update: btrfs-convert is included in Debian 10 buster backports and in Debian 11 bullseye. Install dependencies (''Ubuntu 18.04 LTS''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev OR Install dependencies (''Debian 9''): apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]): wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz tar xfz btrfs-progs-v4.20.1.tar.gz cd btrfs-progs-v4.20.1 ./configure --with-convert=ext2 make make install cd .. rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid -o value -s TYPE /dev/xvda1 # and the same for others Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvda1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) vi /etc/grub.d/00_header Comment the line: #if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi Update grub: grub-install /dev/xvdb update-grub Quit: exit for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V4 interface, stop the server, select the cooked disk as boot disk of this server (or detach the cooked disk and attach it as boot disk on another server). Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / 744dc946abb2127cd503caf7ff7d45ec58dd75a4 658078 658077 2020-09-21T16:50:41Z Seb35 1 update for Debian 10 buster wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated for Debian 10 buster + GandiV5 and works probably also for Debian 11 bullseye. An older version was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster. Update the packages: apt update && apt upgrade -y Install grub-xen instead of grub-efi-amd64: cp -a /etc/default/grub /root/grub apt purge grub-efi-amd64-bin && apt install grub-xen mv /root/grub /etc/default/grub Define backports for Debian 10 (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid -o value -s TYPE /dev/xvdb1 # and the same for others Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) Update grub: grub-install --target x86_64-xen /dev/xvdb update-grub Quit: exit for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. b0808c17a93b8966d5c828a0c8f2d45f6ee9e887 658079 658078 2020-09-21T17:32:05Z Seb35 1 +lien vers l’archive wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated for Debian 10 buster + GandiV5 and works probably also for Debian 11 bullseye. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster. Update the packages: apt update && apt upgrade -y Install grub-xen instead of grub-efi-amd64: cp -a /etc/default/grub /root/grub apt purge grub-efi-amd64-bin && apt install grub-xen mv /root/grub /etc/default/grub Define backports for Debian 10 (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid -o value -s TYPE /dev/xvdb1 # and the same for others Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) Update grub: grub-install --target x86_64-xen /dev/xvdb update-grub Quit: exit for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. 6c58a1b3a8cee2d2ca70151d5b9e92b13f20ab8e Unicode 0 192 429787 2019-09-11T21:26:36Z Seb35 1 notes about UTF-16 wikitext text/x-wiki == [[:wikipedia:UTF-16|UTF-16]] == 1 or 2 code units of 16 bits = 2 bytes If 2 code units, first one is in 0xD800-0xDBFF, second one is in 0xDC00-0xDFFF. * First one: 6 fixed bits (0b110110) then 4 bits encoding the Unicode plan (minus one: 1-16 become 0-15) then 6 strong bits inside the plan * Second one: 6 fixed bits (0b110111) then 10 bits inside the plan Non-private astral planes 0x10000-0xEFFFF are encoded in UTF-16: [\uD800-\uDAFF\uDB00-\uDB7F][\uDC00-\uDFFF] Astral planes are encoded in UTF-16: [\uD800-\uDBFF][\uDC00-\uDFFF] <!-- == [[:wikipedia:UTF-32|UTF-32]] == Number of unused bits in UTF-32: <math>1 - \frac{log_2(17 \times 2^{16})}{log_2(2^{32})} = 1 - \frac{log_2(17) + 16}{32} \approx 0,372266786 \approx 37,2266786 %</math> --> f711a61c5436a551db449ff65b6c927f17fe8730 429834 429787 2019-09-11T22:13:41Z Seb35 1 additional note wikitext text/x-wiki == [[:wikipedia:UTF-16|UTF-16]] == 1 or 2 code units of 16 bits = 2 bytes If 2 code units, first one is in 0xD800-0xDBFF, second one is in 0xDC00-0xDFFF. * First one: 6 fixed bits (0b110110) then 4 bits encoding the Unicode plan (minus one: 1-16 become 0-15) then 6 strong bits inside the plan - note that the plan number is splitted between the two last bits of the first byte and the two first bits of the second byte * Second one: 6 fixed bits (0b110111) then 10 bits inside the plan Non-private astral planes 0x10000-0xEFFFF are encoded in UTF-16: [\uD800-\uDAFF\uDB00-\uDB7F][\uDC00-\uDFFF] Astral planes are encoded in UTF-16: [\uD800-\uDBFF][\uDC00-\uDFFF] <!-- == [[:wikipedia:UTF-32|UTF-32]] == Number of unused bits in UTF-32: <math>1 - \frac{log_2(17 \times 2^{16})}{log_2(2^{32})} = 1 - \frac{log_2(17) + 16}{32} \approx 0,372266786 \approx 37,2266786 %</math> --> be769b3cc36b0dcbd49014183ddeadf2f8f794ad 429875 429834 2019-09-11T22:46:05Z Seb35 1 wikitext text/x-wiki == [[:wikipedia:UTF-16|UTF-16]] == 1 or 2 code units of 16 bits = 2 bytes If 2 code units, first one is in 0xD800-0xDBFF, second one is in 0xDC00-0xDFFF. * First one: 6 fixed bits (0b110110) then 4 bits encoding the Unicode plan (minus one: 1-16 become 0-15) then 6 first bits from inside the plan - note that the plan number is splitted between the two last bits of the first byte and the two first bits of the second byte * Second one: 6 fixed bits (0b110111) then 10 last bits from inside the plan Non-private astral planes 0x10000-0xEFFFF are encoded in UTF-16: [\uD800-\uDAFF\uDB00-\uDB7F][\uDC00-\uDFFF] Astral planes are encoded in UTF-16: [\uD800-\uDBFF][\uDC00-\uDFFF] <!-- == [[:wikipedia:UTF-32|UTF-32]] == Number of unused bits in UTF-32: <math>1 - \frac{log_2(17 \times 2^{16})}{log_2(2^{32})} = 1 - \frac{log_2(17) + 16}{32} \approx 0,372266786 \approx 37,2266786 %</math> --> 97423dcd8ccab89d3fa8cfe95ea71ab6d5d9e5c8 Btrfs 0 189 658080 658079 2020-09-24T18:09:25Z Seb35 1 simplify the process wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5 and works probably also for Debian 11 bullseye. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster. Update the packages: apt update && apt upgrade -y Define backports for Debian 10 (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) Update grub: update-grub Change the reference of the root device (will be xvda1 when it will be the root device): sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg Quit: exit for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64 and grub-efi-amd64-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin mv /root/grub /etc/default/grub update-grub # to check it still work and you should reboot now to be sure it reboots correctly == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] de0ca70ae82c1cc2a2be0ec174ad29f08394426c 658115 658080 2021-06-09T13:31:35Z Seb35 1 /* Promote as root filesystem */ wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5 and works probably also for Debian 11 bullseye. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster. Update the packages: apt update && apt upgrade -y Define backports for Debian 10 (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults". (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) Update grub: update-grub Change the reference of the root device (will be xvda1 when it will be the root device): sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg Quit: exit for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64 and grub-efi-amd64-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin mv /root/grub /etc/default/grub update-grub # to check it still work and you should reboot now to be sure it reboots correctly == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] 0c1702a091a7d67e7fc72916b06f957f78973493 658116 658115 2021-06-09T13:34:31Z Seb35 1 wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5 and works probably also for Debian 11 bullseye. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster. Update the packages: apt update && apt upgrade -y Define backports for Debian 10 (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults". (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) Update grub: update-grub Change the reference of the root device (will be xvda1 when it will be the root device): sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg Quit: exit for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64 and grub-efi-amd64-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin mv /root/grub /etc/default/grub update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] b67bf673a2fc78ce4f5c4b2e7759797d6fad7c58 658133 658116 2022-02-02T20:42:06Z Seb35 1 update for Debian 11 Bullseye wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5 and on 2022-02-02 for Debian 11 bullseye. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster. Update the packages: apt update && apt upgrade -y For Debian 10 Buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 Buster apt update && apt install btrfs-progs # Debian 11 Bullseye On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: (beware: given the two filesystems have the same UUID, the mounted root filesystem could be /dev/xvdb1 – it happened once) ls /dev/xvd* mount|grep xvd blkid Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults". (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) Update grub: update-grub Change the reference of the root device (will be xvda1 when it will be the root device): sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg Quit: exit for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] 7baf4fecf6e414804904b2f6f6d7a85e0debeb9a 658134 658133 2022-02-02T20:43:57Z Seb35 1 typo wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye. Update the packages: apt update && apt upgrade -y For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: (beware: given the two filesystems have the same UUID, the mounted root filesystem could be /dev/xvdb1 – it happened once) ls /dev/xvd* mount|grep xvd blkid Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults". (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) Update grub: update-grub Change the reference of the root device (will be xvda1 when it will be the root device): sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg Quit: exit for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] d27d7e967893e29ae9e70e0c710d9f6eb969a9f0 658135 658134 2022-02-02T21:13:42Z Seb35 1 +link to Wikipedia and dedicated wiki wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye. Update the packages: apt update && apt upgrade -y For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server. == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: (beware: given the two filesystems have the same UUID, the mounted root filesystem could be /dev/xvdb1 – it happened once) ls /dev/xvd* mount|grep xvd blkid Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults". (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) Update grub: update-grub Change the reference of the root device (will be xvda1 when it will be the root device): sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg Quit: exit for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] 8665d780b6b8b6a7062564679e7604391e1759a6 658136 658135 2022-04-23T12:29:53Z Seb35 1 small improvement to avoid launching the wrong disk wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye. Update the packages: apt update && apt upgrade -y For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk, # clone the system disk with another (definitive) name, # start the server, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults". (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) Update grub: update-grub Change the reference of the root device (will be xvda1 when it will be the root device): sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg Quit: exit for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] 05f7b038ad1709477f2bd24da0642791730a5fe6 658146 658136 2023-06-14T09:00:31Z Seb35 1 simplify wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye. For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk, # clone the system disk with another (definitive) name, # start the server, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults". (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) Update grub: update-grub Change the reference of the root device (will be xvda1 when it will be the root device): sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg Quit: exit for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] 9eb6739d701f193d52ace0eeee3f854b27cecaa0 658147 658146 2023-06-14T09:10:42Z Seb35 1 wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye. For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name, # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Copy the result of <code>blkid</code> in some text file on your computer (will be used later). Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Enter the chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt blkid|grep xvdb1 vi /etc/fstab Edit the root filesystem with: (the UUID is from the command blkid) UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1 There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults". (in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.) Update grub: update-grub Change the reference of the root device (will be xvda1 when it will be the root device): sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg Quit: exit for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] 1bd4c2ec36f6eefd01997f70c9174a4364f4d7e5 658148 658147 2023-06-14T21:53:09Z Seb35 1 /* Promote as root filesystem */ simplify wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye. For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name, # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Copy the result of <code>blkid</code> in some text file on your computer (will be used later). Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Edit the /etc/fstab of the btrfs system: uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab Update Grub in a chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt Quit: exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] 4288bc1070d955752362640e535d2f3c0c4fb545 658149 658148 2023-06-15T13:43:29Z Seb35 1 +Script wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye. For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name, # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Copy the result of <code>blkid</code> in some text file on your computer (will be used later). Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Edit the /etc/fstab of the btrfs system: uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab Update Grub in a chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt Quit: exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == Script == This script automates the conversion, with a slightly-modified procedure. On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 11 bullseye. On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name, # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). # Launch this script as root: <syntaxhighlight lang="shell"> #!/bin/sh set -e fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3` blkid=`blkid|grep -F ' LABEL="gandiroot" '` nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2` if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4' exit 2 fi fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1` fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1` echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)" echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)" set -v apt-get install -y btrfs-progs fsck.ext4 -f "$fs_gandiroot_btrfs" btrfs-convert -p "$fs_gandiroot_btrfs" mount "$fs_gandiroot_btrfs" /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt btrfs balance start /mnt for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab chroot /mnt update-grub chroot /mnt apt-get install -y btrfs-progs for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt </syntaxhighlight> == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] fdd4c279d74054d19da75661af924e41f11c16af 658150 658149 2023-06-15T13:49:53Z Seb35 1 /* Script */ wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye. For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name, # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Copy the result of <code>blkid</code> in some text file on your computer (will be used later). Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Edit the /etc/fstab of the btrfs system: uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab Update Grub in a chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt Quit: exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == Script == This script automates the conversion, with a slightly-modified procedure. On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 11 bullseye. On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). # Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>) <syntaxhighlight lang="shell"> #!/bin/sh set -e fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3` blkid=`blkid|grep -F ' LABEL="gandiroot" '` nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2` if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4' exit 2 fi fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1` fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1` echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)" echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)" set -v apt-get install -y btrfs-progs fsck.ext4 -f "$fs_gandiroot_btrfs" btrfs-convert -p "$fs_gandiroot_btrfs" mount "$fs_gandiroot_btrfs" /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt btrfs balance start /mnt for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab chroot /mnt update-grub chroot /mnt apt-get install -y btrfs-progs for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt </syntaxhighlight> In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server and execute: df -hT It should show something like: /dev/xvda1 btrfs 5G 3.2G 1.8G 63% / Delete the old root disk. == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] 8a2918bebeaf98317a23636574e74b0c8bb50f60 658151 658150 2023-06-15T13:50:16Z Seb35 1 /* Create the server */ wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye. For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Copy the result of <code>blkid</code> in some text file on your computer (will be used later). Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Edit the /etc/fstab of the btrfs system: uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab Update Grub in a chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt Quit: exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == Script == This script automates the conversion, with a slightly-modified procedure. On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 11 bullseye. On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). # Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>) <syntaxhighlight lang="shell"> #!/bin/sh set -e fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3` blkid=`blkid|grep -F ' LABEL="gandiroot" '` nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2` if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4' exit 2 fi fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1` fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1` echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)" echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)" set -v apt-get install -y btrfs-progs fsck.ext4 -f "$fs_gandiroot_btrfs" btrfs-convert -p "$fs_gandiroot_btrfs" mount "$fs_gandiroot_btrfs" /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt btrfs balance start /mnt for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab chroot /mnt update-grub chroot /mnt apt-get install -y btrfs-progs for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt </syntaxhighlight> In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server and execute: df -hT It should show something like: /dev/xvda1 btrfs 5G 3.2G 1.8G 63% / Delete the old root disk. == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] 6bfc42f85d7da6247f05ce619bea84d8c1922472 658152 658151 2023-06-15T13:51:12Z Seb35 1 wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this is EXPERIMENTAL and could cause DATA LOSS. This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye. For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Copy the result of <code>blkid</code> in some text file on your computer (will be used later). Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Edit the /etc/fstab of the btrfs system: uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab Update Grub in a chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt Quit: exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == Script == This script automates the conversion, with a slightly-modified procedure. On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye. On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). # Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>) <syntaxhighlight lang="shell"> #!/bin/sh set -e fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3` blkid=`blkid|grep -F ' LABEL="gandiroot" '` nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2` if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4' exit 2 fi fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1` fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1` echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)" echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)" set -v apt-get install -y btrfs-progs fsck.ext4 -f "$fs_gandiroot_btrfs" btrfs-convert -p "$fs_gandiroot_btrfs" mount "$fs_gandiroot_btrfs" /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt btrfs balance start /mnt for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab chroot /mnt update-grub chroot /mnt apt-get install -y btrfs-progs for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt </syntaxhighlight> In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server and execute: df -hT It should show something like: /dev/xvda1 btrfs 5G 3.2G 1.8G 63% / Delete the old root disk. == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] 1411e41423446b545abbb36d7ef862888c8632df 658153 658152 2023-06-15T13:53:26Z Seb35 1 wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this could cause DATA LOSS, be sure you have backups (possibly Gandi snapshots). This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Create the server == On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye. For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). == Convert to btrfs == :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Copy the result of <code>blkid</code> in some text file on your computer (will be used later). Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours == Promote as root filesystem == :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Edit the /etc/fstab of the btrfs system: uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab Update Grub in a chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt Quit: exit == Define the cooked disk as boot disk == In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == Script == This script automates the conversion, with a slightly-modified procedure. On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye. On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). # Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>) <syntaxhighlight lang="shell"> #!/bin/sh set -e fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3` blkid=`blkid|grep -F ' LABEL="gandiroot" '` nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2` if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4' exit 2 fi fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1` fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1` echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)" echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)" set -v apt-get install -y btrfs-progs fsck.ext4 -f "$fs_gandiroot_btrfs" btrfs-convert -p "$fs_gandiroot_btrfs" mount "$fs_gandiroot_btrfs" /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt btrfs balance start /mnt for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt </syntaxhighlight> In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server and execute: df -hT It should show something like: /dev/xvda1 btrfs 5G 3.2G 1.8G 63% / Delete the old root disk. == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] 368f93a6e35cb81315185417b7b61ce7e8b0ba13 658154 658153 2023-06-15T13:55:32Z Seb35 1 Add a chapter section "Manual procedure" wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this could cause DATA LOSS, be sure you have backups (possibly Gandi snapshots). This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Manual procedure == === Create the server === On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye. For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). === Convert to btrfs === :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Copy the result of <code>blkid</code> in some text file on your computer (will be used later). Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours === Promote as root filesystem === :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Edit the /etc/fstab of the btrfs system: uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab Update Grub in a chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt Quit: exit === Define the cooked disk as boot disk === In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Scripted procedure == This script automates the conversion, with a slightly-modified procedure. On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye. On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). # Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>) <syntaxhighlight lang="shell"> #!/bin/sh set -e fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3` blkid=`blkid|grep -F ' LABEL="gandiroot" '` nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2` if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4' exit 2 fi fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1` fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1` echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)" echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)" set -v apt-get install -y btrfs-progs fsck.ext4 -f "$fs_gandiroot_btrfs" btrfs-convert -p "$fs_gandiroot_btrfs" mount "$fs_gandiroot_btrfs" /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt btrfs balance start /mnt for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt </syntaxhighlight> In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server and execute: df -hT It should show something like: /dev/xvda1 btrfs 5G 3.2G 1.8G 63% / Delete the old root disk. == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] 57ff105f2848b80f1ef7d7e12edcd468b08298c1 658155 658154 2023-06-15T13:59:53Z Seb35 1 /* Scripted procedure */ wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this could cause DATA LOSS, be sure you have backups (possibly Gandi snapshots). This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Manual procedure == === Create the server === On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye. For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). === Convert to btrfs === :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Copy the result of <code>blkid</code> in some text file on your computer (will be used later). Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours === Promote as root filesystem === :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Edit the /etc/fstab of the btrfs system: uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab Update Grub in a chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt Quit: exit === Define the cooked disk as boot disk === In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Scripted procedure == This script automates the conversion, with a slightly-modified procedure. On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye. On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). # Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>) <syntaxhighlight lang="shell"> #!/bin/sh set -e fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3` blkid=`blkid|grep -F ' LABEL="gandiroot" '` nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2` if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4' exit 2 fi fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1` fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1` echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)" echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)" set -v apt-get install -y btrfs-progs fsck.ext4 -f "$fs_gandiroot_btrfs" btrfs-convert -p "$fs_gandiroot_btrfs" mount "$fs_gandiroot_btrfs" /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt btrfs balance start /mnt new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt </syntaxhighlight> In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server and execute: df -hT It should show something like: /dev/xvda1 btrfs 5G 3.2G 1.8G 63% / Delete the old root disk. == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] a7bea4d4e9d7aaac6f1b09081fe18780d049af6b 658156 658155 2023-06-15T15:19:53Z Seb35 1 Details wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this could cause DATA LOSS, be sure you have backups (possibly Gandi snapshots). This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Manual procedure == === Create the server === On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye. For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). === Convert to btrfs === :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Copy the result of <code>blkid</code> in some text file on your computer (will be used later). Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours === Promote as root filesystem === :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Edit the /etc/fstab of the btrfs system: uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab Update Grub in a chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt Quit: exit === Define the cooked disk as boot disk === In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Scripted procedure == This script automates the conversion, with a slightly-modified procedure. On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye. On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). # Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>) <syntaxhighlight lang="shell"> #!/bin/sh set -e fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3` blkid=`blkid|grep -F ' LABEL="gandiroot" '` nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2` if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4' exit 2 fi fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1` fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1` echo echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)" echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)" set -v apt-get install -y btrfs-progs fsck.ext4 -f "$fs_gandiroot_btrfs" btrfs-convert -p "$fs_gandiroot_btrfs" mount "$fs_gandiroot_btrfs" /mnt btrfs subvolume delete -C /mnt/ext2_saved btrfs filesystem defragment -r /mnt btrfs balance start /mnt new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt </syntaxhighlight> In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server and execute: df -hT It should show something like: /dev/xvda1 btrfs 5G 1.4G 3.5G 28% / Delete the old root disk. == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] eba8366bf50e3868516a5d0763de7dbe269e94cf 658157 658156 2023-06-15T15:43:23Z Seb35 1 /* Scripted procedure */ wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this could cause DATA LOSS, be sure you have backups (possibly Gandi snapshots). This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Manual procedure == === Create the server === On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye. For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). === Convert to btrfs === :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Copy the result of <code>blkid</code> in some text file on your computer (will be used later). Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours === Promote as root filesystem === :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Edit the /etc/fstab of the btrfs system: uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab Update Grub in a chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt Quit: exit === Define the cooked disk as boot disk === In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Scripted procedure == This script automates the conversion, with a slightly-modified procedure. On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye. On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). # Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>) <syntaxhighlight lang="shell"> #!/bin/sh set -e fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3` blkid=`blkid|grep -F ' LABEL="gandiroot" '` nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2` if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4' exit 2 fi fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1` fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1` echo echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)" echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)" set -v apt-get update apt-get install -y btrfs-progs fsck.ext4 -f "$fs_gandiroot_btrfs" btrfs-convert -p "$fs_gandiroot_btrfs" mount "$fs_gandiroot_btrfs" /mnt btrfs subvolume delete -C /mnt/ext2_saved btrfs filesystem defragment -r /mnt btrfs balance start /mnt new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt </syntaxhighlight> In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server and execute: df -hT It should show something like: /dev/xvda1 btrfs 5G 1.4G 3.5G 28% / Delete the old root disk. == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] ea4ec4dccba602a366ce734ef628815fea4c4edc Accueil 0 1 658109 658075 2021-04-12T08:42:48Z Seb35 1 +avertissement : Git ne fonctionne plus wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.) Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : (ne fonctionne plus en 2021) :<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code> == Pages du wiki == [[Special:Version]] === Tutoriaux === * [[Tutorial:Beautiful MediaWiki URLs]] * [[Tutorial:Packaging de WebApps]] === Autres === * [[Présentation:Wikis]] * [[CRM]] (comparaison de CRMs libres) * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] === Technique === * [[Btrfs]] (en anglais) * [[Unicode]] c533a3581b309248802bebc7bdf0c87e7f416a9a 658117 658109 2021-07-07T10:59:05Z Seb35 1 wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.) Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : (ne fonctionne plus en 2021) :<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code> == Pages du wiki == [[Special:Version]] === Tutoriaux === * [[Tutorial:Beautiful MediaWiki URLs]] * [[Tutorial:Packaging de WebApps]] === Autres === * [[Présentation:Wikis]] * [[CRM]] (comparaison de CRMs libres) * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] === Technique === * [[Btrfs]] (en anglais) * [[Unicode]] * [[Firewall]] 3400277f0eda40b7904e57993411aaaca7cd79a0 658118 658117 2021-07-07T10:59:44Z Seb35 1 +pare-feu wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.) Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : (ne fonctionne plus en 2021) :<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code> == Pages du wiki == [[Special:Version]] === Tutoriaux === * [[Tutorial:Beautiful MediaWiki URLs]] * [[Tutorial:Packaging de WebApps]] === Autres === * [[Présentation:Wikis]] * [[CRM]] (comparaison de CRMs libres) * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] === Technique === * [[Btrfs]] (en anglais) * [[Unicode]] * [[Pare-feu]] 48f617433b9d3f46c6a8e29549c5e54e595676b6 658126 658118 2021-07-31T17:59:21Z Seb35 1 /* Pages du wiki */ +PrivateBin (désinstallé de mon serveur, je garde cette doc) wikitext text/x-wiki Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]]. Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.) Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : (ne fonctionne plus en 2021) :<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code> == Pages du wiki == [[Special:Version]] === Tutoriaux === * [[Tutorial:Beautiful MediaWiki URLs]] * [[Tutorial:Packaging de WebApps]] === Autres === * [[Présentation:Wikis]] * [[CRM]] (comparaison de CRMs libres) * [[Archéo Lex]] * [[Syntaxes de formatage léger]] * [[Log/Seb35]] * [[MediaWiki]] === Technique === * [[Btrfs]] (en anglais) * [[Unicode]] * [[Pare-feu]] * [[PrivateBin]] 0d4214706a68f58154076b5cb7700f0ccc0f0f4e Legi.py 0 194 658110 2021-05-09T17:08:02Z Seb35 1 création de documentation, pour moi ou toute personne intéressée wikitext text/x-wiki En légistique numérique, '''legi.py''' transforme la base de données LEGI, contenant les lois consolidées, produite officiellement par la DILA et consistant en des fichiers XML, en une base SQL (SQLite uniquement). Ce programme est écrit en Python 3.7, dont l’auteur principal est le développeur Changaco et dont la licence est CC0. Dans la chaîne de traitement, legi.py est utilisé en première partie ; Archéo Lex utilise notamment la colonne sur la date de dernière mise à jour pour ne modifier que les nouveautés du jour. Dans [https://github.com/Legilibre/legi.py/pull/54 une Pull Request] que, idéalement, je finalise, legi.py pourrait être étendu à la base de données JORF contenant notamment les lois dans leur version initiale, chose manquante dans LEGI. Plus loin, il s’agirait de mettre en correspondance les bases JORF et LEGI [https://github.com/Legilibre/legi.py/issues/70]. == Installation sous Debian 10 sur un serveur == :''Cette section explique comment installer avec Git legi.py et mettre en place les mises à jour quotidiennes.'' … ea6662230a68bc3b5c081171e81e8273c2f5be20 658111 658110 2021-05-09T17:57:24Z Seb35 1 /* Installation sous Debian 10 sur un serveur */ ++ wikitext text/x-wiki En légistique numérique, '''legi.py''' transforme la base de données LEGI, contenant les lois consolidées, produite officiellement par la DILA et consistant en des fichiers XML, en une base SQL (SQLite uniquement). Ce programme est écrit en Python 3.7, dont l’auteur principal est le développeur Changaco et dont la licence est CC0. Dans la chaîne de traitement, legi.py est utilisé en première partie ; Archéo Lex utilise notamment la colonne sur la date de dernière mise à jour pour ne modifier que les nouveautés du jour. Dans [https://github.com/Legilibre/legi.py/pull/54 une Pull Request] que, idéalement, je finalise, legi.py pourrait être étendu à la base de données JORF contenant notamment les lois dans leur version initiale, chose manquante dans LEGI. Plus loin, il s’agirait de mettre en correspondance les bases JORF et LEGI [https://github.com/Legilibre/legi.py/issues/70]. == Installation sous Debian 10 == :''Cette section explique comment installer avec Git legi.py et mettre en place les mises à jour quotidiennes.'' On utilise sudo lorsque nécessaire uniquement. Écrit et testé en mai 2021. Le code de legi.py sera placé dans <code>/opt/legi.py</code>, les données XML officielles dans <code>/srv/data/legi/xml</code> et la base de données résultat dans <code>/srv/data/legi/sql</code>. ; Pré-requis * Système : Debian 10 * Connectivité : IPv4 nécessaire (d’une part pour le téléchargement sur Github puisque celui-ci n’a pas encore l’IPv6 [sic], d’autre part pour les téléchargements quotidiens depuis la DILA) ; Installation des dépendances Paquets généraux : <code> sudo apt-get install -y git gcc g++ python3-pip python3-setuptools python3-dev </code> (à part git, les suivants sont nécessaires pour la compilation du paquet Python « hunspell » lors de l’installation avec pip) Paquets spécifiques : <code> sudo apt-get install -y libarchive13 hunspell hunspell-fr libhunspell-dev </code> ; Installation de legi.py <code> sudo mkdir /opt/legi.py sudo chown $USER: /opt/legi.py git clone https://github.com/Legilibre/legi.py /opt/legi.py </code> 3a4b2faddd3ab0ee45e2f6ade2ff9349bfc6ecd8 658112 658111 2021-05-09T19:57:52Z Seb35 1 /* Installation sous Debian 10 */ procédure telle que faite à l’instant wikitext text/x-wiki En légistique numérique, '''legi.py''' transforme la base de données LEGI, contenant les lois consolidées, produite officiellement par la DILA et consistant en des fichiers XML, en une base SQL (SQLite uniquement). Ce programme est écrit en Python 3.7, dont l’auteur principal est le développeur Changaco et dont la licence est CC0. Dans la chaîne de traitement, legi.py est utilisé en première partie ; Archéo Lex utilise notamment la colonne sur la date de dernière mise à jour pour ne modifier que les nouveautés du jour. Dans [https://github.com/Legilibre/legi.py/pull/54 une Pull Request] que, idéalement, je finalise, legi.py pourrait être étendu à la base de données JORF contenant notamment les lois dans leur version initiale, chose manquante dans LEGI. Plus loin, il s’agirait de mettre en correspondance les bases JORF et LEGI [https://github.com/Legilibre/legi.py/issues/70]. == Installation sous Debian 10 == :''Cette section explique comment installer legi.py avec Git et mettre en place les mises à jour quotidiennes. Procédure écrite et testée en mai 2021.'' Le code de legi.py sera placé dans <code>/opt/legi.py</code>, les données XML officielles dans <code>/srv/data/legi/xml</code> et la base de données résultat dans <code>/srv/data/legi/sql</code>. Les commandes sont ici utilisées avec sudo puisque cela a vocation à être un service « système ». ; Pré-requis * Système : Debian 10 * Connectivité : IPv4 nécessaire (d’une part pour le téléchargement sur Github puisque celui-ci n’a pas encore l’IPv6 [sic], d’autre part pour les téléchargements quotidiens depuis la DILA) * Ressources : ** téléchargement initial : ≈ 3 Gio ** téléchargements quotidiens : ≈ 1 Mio, sauf lors d’un ré-export complet de la base XML une fois par an (≈ 1 Gio dans ce cas) ** stockage du XML compressé : ≈ 3-4 Gio ** stockage de la base SQL : ≈ 4 Gio ** CPU/mémoire : peu consommateur sauf lors du calcul initial, 1-2 Gio est suffisant, avoir plus de ressources augmente la vitesse notamment du calcul initial === Installation des dépendances === Paquets généraux : sudo apt-get install -y git gcc g++ python3-pip python3-setuptools python3-dev À part git, les suivants sont nécessaires pour la compilation du paquet Python « hunspell » lors de l’installation avec pip. Paquets spécifiques : sudo apt-get install -y libarchive13 hunspell hunspell-fr libhunspell-dev === Installation de legi.py === sudo mkdir /opt/legi.py sudo git clone <nowiki>https://github.com/Legilibre/legi.py</nowiki> /opt/legi.py cd /opt/legi.py sudo pip3 install -r requirements.txt === Création de la mise à jour quotidienne === Cette mise à jour est programmée avec un timer systemd et un utilisateur système dédié. Noter que la mise à jour est programmée ici du lundi au vendredi entre 23:15 et 23:30 et toutes les 12 heures : selon [https://github.com/Legilibre/salon/issues/18 ces stats], l’heure de livraison étant variable, souvent entre 21:00 et 23:00, mais parfois plus tard ; on pourrait programmer une vérification de la présence de livraison du jour à partir de 20:00 (ce que je fais pour Archéo Lex). La vérification toutes les 12 heures est notamment pour le cas d’un ordinateur de bureau, pas forcément allumé en soirée. Sur la pérennité de la livraison via FTP, il a été annoncé par la DILA le 29 novembre 2019 (lors de l’inauguration des nouvelles API) que cela était pérenne. Note d’implémentation : j’utilise ici wget pour faire le téléchargement même si legi.py a un utilitaire dédié, plus par conviction personnelle qu’il est préférable d’utiliser les outils existants plutôt que de les réimplémenter. sudo adduser --system --home / --shell /usr/bin/sh --no-create-home --disabled-password legi sudo mkdir -p /usr/local/lib/systemd/system sudo vi /usr/local/lib/systemd/system/legi-database-update.service # copier le contenu ci-dessous sudo vi /usr/local/lib/systemd/system/legi-database-update.timer # copier le contenu ci-dessous sudo systemctl daemon-reload sudo mkdir -p /var/log/legi /srv/data/legi/{xml,sql} sudo chown -R legi /var/log/legi /srv/data/legi sudo systemctl start legi-database-update.timer sudo systemctl enable legi-database-update.timer ; /usr/local/lib/systemd/system/legi-database-update.service [Unit] Description=LEGI database update Documentation=<nowiki>https://github.com/Legilibre/legi.py</nowiki> [Service] Type=oneshot WorkingDirectory=/opt/legi.py ExecStartPre=wget -c -N --no-remove-listing --no-verbose -nH -P /srv/data/legi/xml '<nowiki>ftp://echanges.dila.gouv.fr/LEGI/*.tar.gz</nowiki>' ExecStart=python3 -m legi.tar2sqlite /srv/data/legi/sql/legi.sqlite /srv/data/legi/xml User=legi StandardOutput=file:/var/log/legi/update.log ; /usr/local/lib/systemd/system/legi-database-update.timer [Unit] Description=Run LEGI database update [Timer] OnCalendar=Mon..Fri *-*-* 11/12:15:00 RandomizedDelaySec=900 [Install] WantedBy=timers.target === Lancement initial === On peut lancer le calcul initial tout de suite : sudo systemctl start legi-database-update.service --no-block sudo systemctl status legi-database-update.service Ce calcul initial mettra quelques heures, variable selon la vitesse de téléchargement et les ressources CPU/mémoire disponible. == Utilisation au quotidien == sqlite3 /srv/data/legi/sql/legi.sqlite 5b8ab71e444f5a0b2380efb9f04b470f42dd85d4 658113 658112 2021-05-09T19:59:11Z Seb35 1 détail wikitext text/x-wiki En légistique numérique, '''legi.py''' transforme la base de données LEGI, contenant les lois consolidées, produite officiellement par la DILA et consistant en des fichiers XML, en une base SQL (SQLite uniquement). Ce programme est écrit en Python 3.7, dont l’auteur principal est le développeur Changaco et dont la licence est CC0. Dans la chaîne de traitement de [[Archéo Lex]], legi.py est utilisé en première partie ; Archéo Lex utilise notamment la colonne sur la date de dernière mise à jour pour ne modifier que les nouveautés du jour. Dans [https://github.com/Legilibre/legi.py/pull/54 une Pull Request] que, idéalement, je finalise, legi.py pourrait être étendu à la base de données JORF contenant notamment les lois dans leur version initiale, chose manquante dans LEGI. Plus loin, il s’agirait de mettre en correspondance les bases JORF et LEGI [https://github.com/Legilibre/legi.py/issues/70]. == Installation sous Debian 10 == :''Cette section explique comment installer legi.py avec Git et mettre en place les mises à jour quotidiennes.'' :''Procédure écrite et testée en mai 2021.'' Le code de legi.py sera placé dans <code>/opt/legi.py</code>, les données XML officielles dans <code>/srv/data/legi/xml</code> et la base de données résultat dans <code>/srv/data/legi/sql</code>. Les commandes sont ici utilisées avec sudo puisque cela a vocation à être un service « système ». ; Pré-requis * Système : Debian 10 * Connectivité : IPv4 nécessaire (d’une part pour le téléchargement sur Github puisque celui-ci n’a pas encore l’IPv6 [sic], d’autre part pour les téléchargements quotidiens depuis la DILA) * Ressources : ** téléchargement initial : ≈ 3 Gio ** téléchargements quotidiens : ≈ 1 Mio, sauf lors d’un ré-export complet de la base XML une fois par an (≈ 1 Gio dans ce cas) ** stockage du XML compressé : ≈ 3-4 Gio ** stockage de la base SQL : ≈ 4 Gio ** CPU/mémoire : peu consommateur sauf lors du calcul initial, 1-2 Gio est suffisant, avoir plus de ressources augmente la vitesse notamment du calcul initial === Installation des dépendances === Paquets généraux : sudo apt-get install -y git gcc g++ python3-pip python3-setuptools python3-dev À part git, les suivants sont nécessaires pour la compilation du paquet Python « hunspell » lors de l’installation avec pip. Paquets spécifiques : sudo apt-get install -y libarchive13 hunspell hunspell-fr libhunspell-dev === Installation de legi.py === sudo mkdir /opt/legi.py sudo git clone <nowiki>https://github.com/Legilibre/legi.py</nowiki> /opt/legi.py cd /opt/legi.py sudo pip3 install -r requirements.txt === Création de la mise à jour quotidienne === Cette mise à jour est programmée avec un timer systemd et un utilisateur système dédié. Noter que la mise à jour est programmée ici du lundi au vendredi entre 23:15 et 23:30 et toutes les 12 heures : selon [https://github.com/Legilibre/salon/issues/18 ces stats], l’heure de livraison étant variable, souvent entre 21:00 et 23:00, mais parfois plus tard ; on pourrait programmer une vérification de la présence de livraison du jour à partir de 20:00 (ce que je fais pour Archéo Lex). La vérification toutes les 12 heures est notamment pour le cas d’un ordinateur de bureau, pas forcément allumé en soirée. Sur la pérennité de la livraison via FTP, il a été annoncé par la DILA le 29 novembre 2019 (lors de l’inauguration des nouvelles API) que cela était pérenne. Note d’implémentation : j’utilise ici wget pour faire le téléchargement même si legi.py a un utilitaire dédié, plus par conviction personnelle qu’il est préférable d’utiliser les outils existants plutôt que de les réimplémenter. sudo adduser --system --home / --shell /usr/bin/sh --no-create-home --disabled-password legi sudo mkdir -p /usr/local/lib/systemd/system sudo vi /usr/local/lib/systemd/system/legi-database-update.service # copier le contenu ci-dessous sudo vi /usr/local/lib/systemd/system/legi-database-update.timer # copier le contenu ci-dessous sudo systemctl daemon-reload sudo mkdir -p /var/log/legi /srv/data/legi/{xml,sql} sudo chown -R legi /var/log/legi /srv/data/legi sudo systemctl start legi-database-update.timer sudo systemctl enable legi-database-update.timer ; /usr/local/lib/systemd/system/legi-database-update.service [Unit] Description=LEGI database update Documentation=<nowiki>https://github.com/Legilibre/legi.py</nowiki> [Service] Type=oneshot WorkingDirectory=/opt/legi.py ExecStartPre=wget -c -N --no-remove-listing --no-verbose -nH -P /srv/data/legi/xml '<nowiki>ftp://echanges.dila.gouv.fr/LEGI/*.tar.gz</nowiki>' ExecStart=python3 -m legi.tar2sqlite /srv/data/legi/sql/legi.sqlite /srv/data/legi/xml User=legi StandardOutput=file:/var/log/legi/update.log ; /usr/local/lib/systemd/system/legi-database-update.timer [Unit] Description=Run LEGI database update [Timer] OnCalendar=Mon..Fri *-*-* 11/12:15:00 RandomizedDelaySec=900 [Install] WantedBy=timers.target === Lancement initial === On peut lancer le calcul initial tout de suite : sudo systemctl start legi-database-update.service --no-block sudo systemctl status legi-database-update.service Ce calcul initial mettra quelques heures, variable selon la vitesse de téléchargement et les ressources CPU/mémoire disponible. == Utilisation au quotidien == sqlite3 /srv/data/legi/sql/legi.sqlite fbb09e9cf8cae942613744ae264130982315aab7 Git 0 195 658114 2021-05-10T07:42:45Z Seb35 1 Page créée avec « Diverses astuces à propos de Git == Messages d’erreur == === <code>fatal: impossible de trouve le nom pour le sous-module 'data'</code> === En anglais : <code>fatal... » wikitext text/x-wiki Diverses astuces à propos de Git == Messages d’erreur == === <code>fatal: impossible de trouve le nom pour le sous-module 'data'</code> === En anglais : <code>fatal: could not lookup name for submodule 'data'</code>. '''Problème :''' Message d’erreur fatale lors de la commande <code>git submodule absorbgitdirs</code>. J’avais enregistré un sous-module contenant lui-même un dossier <code>.git</code> et essayait d’absorber ce dossier <code>.git</code> du sous-module dans le dossier <code>.git/modules/data</code> du superprojet. '''Résolution :''' le sous-module n’était pas inscrit dans le fichier <code>.gitmodules</code> du superprojet, il faut l’y inscrire et relancer la commande. f05bc345c7095b274347e9b81fbb16724c0f6bd6 Pare-feu 0 196 658119 2021-07-07T11:16:43Z Seb35 1 qq notes sur les pare-feu, à compléter dans la durée, ici DHCP wikitext text/x-wiki Liste de quelques règles à autoriser (ou non), non-exhaustif. Écrit en syntaxe nft. == DHCP == === Poste client === En IPv4, * accepter les requêtes sortantes vers un serveur DHCP (ip … → 255.255.255.255 udp 68 → 67) ; * accepter les requêtes entrantes permettant la réponse (ip … → 255.255.255.255 udp 67 → 68) ; * oublier les requêtes entrantes venant d’autres clients à destination des serveurs DHCP (udp … → 67). chain input { type filter hook input priority 0; ip daddr 255.255.255.255 udp sport 67 udp dport 68 counter accept comment "DHCP client" udp dport 67 counter drop comment "DHCP from other clients" } chain output { type filter hook output priority 0; ip daddr 255.255.255.255 udp sport 68 udp dport 67 counter accept comment "DHCP client" } 23f19cd43c2952bef8d0d618e8d4fdcc8c59cd79 Monorepo Git 0 197 658120 2021-07-19T11:54:08Z Seb35 1 étude wikitext text/x-wiki Cette page est une étude pour trouver la meilleure solution de faire un monorepo Git, ou plus exactement, idéalement, un repo Git qui serait à la fois : * un monorepo (qu’on puisse télécharger en une seule fois) * un multi-repo où certains dossiers serait des repo Git ayant leur historique autonome. Dans les contraintes que j’impose, il faut : * que les solutions potentielles soient possibles en l’état actuel de Git ou, a maximum, un programme Bourne shell d’une taille relativement faible (afin d’être compatible sur un maximum de plate-formes et qu’il reste lisible et compréhensible), * il peut y avoir une forme d’équivalence entre deux états "monorepo" et "multirepo" évenutuellement disticts mais switchable avec une commande, * les commandes standard Git devraient fonctionner, au moins dans un certain état "monorepo"/"multirepo" s’ils sont distincts, * la performance doit rester acceptable <small>(je sais, c’est vague et ça dépend des situations)</small>. Les cas d’usage que je prévoie sont : * pour Archéo Lex : pouvoir aggréger l’ensemble des lois françaises dans un seul monorepo mais en ayant la possibilité de télécharger seulement des sous-ensembles, par exemples les décrets, * pour MediaWiki : pouvoir avoir le logiciel de base (un repo) avec les extensions (chacun dans un repo) où le déploiement est un monorepo comportant la version de base + les extensions déployées dans une certaine version, éventuellement patchée. == Briques de base == Sous-modules Git (voir gitsubmodules(7)) Espaces de noms Git (voir gitnamespaces(7)) Dépôt distant de type ''ext'' (voir git-remote-ext(1)) Ilôts delta ''(delta islands)'' (voir git-pack-objects(1)) Les options de configuration, par exemple "diff.submodule" cc07a74b8cbe2db6a63bc2614230d97198d4e70f 658121 658120 2021-07-19T12:59:11Z Seb35 1 ++pour les git submodules wikitext text/x-wiki Cette page est une étude pour trouver la meilleure solution de faire un monorepo Git, ou plus exactement, idéalement, un repo Git qui serait à la fois : * un monorepo (qu’on puisse télécharger en une seule fois) * un multi-repo où certains dossiers serait des repo Git ayant leur historique autonome. Dans les contraintes imposées, il faut : * que les solutions potentielles soient possibles en l’état actuel de Git ou, a maximum, un programme Bourne shell d’une taille relativement faible (afin d’être compatible sur un maximum de plate-formes et qu’il reste lisible et compréhensible), * il peut y avoir une forme d’équivalence entre deux états "monorepo" et "multirepo" évenutuellement disticts mais switchable avec une commande, * les commandes standard Git devraient fonctionner, au moins dans un certain état "monorepo"/"multirepo" s’ils sont distincts, * la performance doit rester acceptable <small>(je sais, c’est vague et ça dépend des situations)</small>. == Cas d’usage == Les cas d’usage que je prévoie sont : * pour Archéo Lex : pouvoir aggréger l’ensemble des lois françaises dans un seul monorepo (au niveau stockage) mais en ayant la possibilité de télécharger seulement des sous-ensembles, par exemples les décrets, * pour MediaWiki : pouvoir avoir le logiciel de base (un repo) avec les extensions (chacun dans un repo) où le déploiement est un monorepo comportant la version de base + les extensions déployées dans une certaine version, éventuellement patchée. == Briques de base == Sous-modules Git (voir gitsubmodules(7)) ''alternates'' (voir gitrepository-layout(5)) Espaces de noms Git (voir gitnamespaces(7)) Dépôt distant de type ''ext'' (voir git-remote-ext(1)) Ilôts delta ''(delta islands)'' (voir git-pack-objects(1)) Les options de configuration, par exemple "diff.submodule" == Briques de solution == == Plusieurs repos indépendants == Ceci n’est pas une solution au problème exposé car il n’y a jamais de monorepo, au sens que la version globale et unifiée d’un repo et de ses sous-repos n’est jamais présente. C’est toutefois une partie d’une éventuelle solution, intégrée à une autre brique de solution. Méthode : * Faire un repo Git « parent » * Ajouter les repos Git « enfants » avec des `git clone` dans des dossiers du repo parent * Faire des `git commit` dans chacun des enfants et du parent … === Sous-modules classiques === Méthode : * Faire un repo Git « parent » * Ajouter les repos Git « enfants » *# Ajouter les sous-modules avec `git submodule add|init|update` *# Ajouter un repo Git normal dans un dossier, puis, dans le repo parent, faire un git-add(1) (il y a un avertissement, c’est normal), puis git-submodule(1) (absorbgitdirs) sur ce dossier pour transférer le dossier <enfant>/.git dans <parent>/.git/modules/<enfant> * `git commit` dans le repo parent pour enregistrer la version * `git submodule deinit` pour retirer le sous-module Avantages : * Très standard depuis longtemps, au moins pour l’organisation et les commandes de base * Gestion de la récursion (enfants d’enfants) * En local, tout l’historique est dans le dossier <parent>/.git Inconvénients : * Les repo enfants ne font pas partie du repo parent : *# En cas d’accès distant, il faut rendre les repos enfants accessibles *# En cas de clone du repo parent, seul le repo parent est téléchargé par défaut *#: Cela peut être changé au cas par cas avec `git clone --recurse-submodules` ou configuré de façon permanente avec "submodule.recurse", "fetch.recurseSubmodules" et "submodule.<name>.fetchRecurseSubmodules" *# Lors d’un push, il faut pousser aussi les repos enfants *#: Cela peut être changé au cas par cas avec `git push --recurse-submodules=check|on-demand|no` configuré de façon permanente avec "submodule.recurse" et "push.recurseSubmodules" *# La compression est donc dégradée par rapport à un object store global *# La perfomance lors d’un clone est dégradée par rapport à un clone global * En cas de changement de branche (pour un repo ayant un work tree) : ** il y a des avertissements si les branches source et destination ont des repos enfants ayant des statuts "enregistré dans un commit"/"non-enregistré dans un commit" différents (dans le 2e cas, ça peut être un dossier "non suivi" ou "ignoré") ** il faut synchroniser a posteriori les repos enfants : si on oublie, on est alors dans un état intermédiaire entre deux commits * L’algorithme de fusion ne fusionne pas à l’intérieur des sous-modules *: Il faut fusionner chacun des sous-modules puis, lors de la fusion du repo parent, résoudre le conflit de fusion en préférant les commits fusionnés des repos enfants * Il n’y a pas d’ordre canonique dans le fichier .gitmodules *: Les commandes `git submodule add` ajoutent à la fin du fichier les nouveaux sous-modules *: En cas de fusion, même si deux fichiers .gitmodules sont sémantiquement identiques (mêmes sous-modules, mêmes paramètres pour chaque sous-module), il peut y avoir un conflit de fusion sur ce fichier * Lors du checkout, la référence HEAD des sous-modules pointe vers un commit et non vers la branche indiquée dans le fichier .gitmodules *: Il est moins aisé de mettre à jour en masse les sous-modules (par exemple dans MediaWiki, dans le principal dépôt d’extensions (Gerrit), les extensions MediaWiki sont dans des branches correspondant à la version majeure de MediaWiki (par exemple REL1_35 pour la branche majeure 1.35) : par défaut il n’est pas possible de faire un `git submodule foreach git fetch` ou `git iterate -- fetch` (programme complémentaire git-iterate) * Le support des sous-modules évolue (en s’améliorant amha) mais certaines commandes ou options de configuration n’étaient pas disponibles à l’origine *: Cela amoindrit la facilité d’utilisation pour les anciennes versions de Git 183cab411c2ed70c089e94b8eb100e9d726599af 658122 658121 2021-07-19T16:10:23Z Seb35 1 +Monorepo wikitext text/x-wiki Cette page est une étude pour trouver la meilleure solution de faire un monorepo Git, ou plus exactement, idéalement, un repo Git qui serait à la fois : * un monorepo (qu’on puisse télécharger en une seule fois) * un multi-repo où certains dossiers serait des repo Git ayant leur historique autonome. Dans les contraintes imposées, il faut : * que les solutions potentielles soient possibles en l’état actuel de Git ou, a maximum, un programme Bourne shell d’une taille relativement faible (afin d’être compatible sur un maximum de plate-formes et qu’il reste lisible et compréhensible), * il peut y avoir une forme d’équivalence entre deux états "monorepo" et "multirepo" évenutuellement disticts mais switchable avec une commande, * les commandes standard Git devraient fonctionner, au moins dans un certain état "monorepo"/"multirepo" s’ils sont distincts, * la performance doit rester acceptable <small>(je sais, c’est vague et ça dépend des situations)</small>. == Cas d’usage == Les cas d’usage que je prévoie sont : * pour Archéo Lex : pouvoir aggréger l’ensemble des lois françaises dans un seul monorepo (au niveau stockage) mais en ayant la possibilité de télécharger seulement des sous-ensembles, par exemples les décrets, * pour MediaWiki : pouvoir avoir le logiciel de base (un repo) avec les extensions (chacun dans un repo) où le déploiement est un monorepo comportant la version de base + les extensions déployées dans une certaine version, éventuellement patchée. == Briques de base == Sous-modules Git (voir gitsubmodules(7)) ''alternates'' (voir gitrepository-layout(5)) Espaces de noms Git (voir gitnamespaces(7)) Dépôt distant de type ''ext'' (voir git-remote-ext(1)) Ilôts delta ''(delta islands)'' (voir git-pack-objects(1)) Les options de configuration, par exemple "diff.submodule" == Briques de solution == == Plusieurs repos indépendants == Ceci n’est pas une solution au problème exposé car il n’y a jamais de monorepo, au sens que la version globale et unifiée d’un repo et de ses sous-repos n’est jamais présente. C’est toutefois une partie d’une éventuelle solution, intégrée à une autre brique de solution. Méthode : * Faire un repo Git « parent » * Ajouter les repos Git « enfants » avec des `git clone` dans des dossiers du repo parent * Faire des `git commit` dans chacun des enfants et du parent … === Sous-modules classiques === Méthode : * Faire un repo Git « parent » * Ajouter les repos Git « enfants » *# Ajouter les sous-modules avec `git submodule add|init|update` *# Ajouter un repo Git normal dans un dossier, puis, dans le repo parent, faire un git-add(1) (il y a un avertissement, c’est normal), puis git-submodule(1) (absorbgitdirs) sur ce dossier pour transférer le dossier <enfant>/.git dans <parent>/.git/modules/<enfant> * `git commit` dans le repo parent pour enregistrer la version * `git submodule deinit` pour retirer le sous-module Avantages : * Très standard depuis longtemps, au moins pour l’organisation et les commandes de base * Gestion de la récursion (enfants d’enfants) * En local, tout l’historique est dans le dossier <parent>/.git Inconvénients : * Les repo enfants ne font pas partie du repo parent : *# En cas d’accès distant, il faut rendre les repos enfants accessibles *# En cas de clone du repo parent, seul le repo parent est téléchargé par défaut *#: Cela peut être changé au cas par cas avec `git clone --recurse-submodules` ou configuré de façon permanente avec "submodule.recurse", "fetch.recurseSubmodules" et "submodule.<name>.fetchRecurseSubmodules" *# Lors d’un push, il faut pousser aussi les repos enfants *#: Cela peut être changé au cas par cas avec `git push --recurse-submodules=check|on-demand|no` configuré de façon permanente avec "submodule.recurse" et "push.recurseSubmodules" *# La compression est donc dégradée par rapport à un object store global *# La perfomance lors d’un clone est dégradée par rapport à un clone global * En cas de changement de branche (pour un repo ayant un work tree) : ** il y a des avertissements si les branches source et destination ont des repos enfants ayant des statuts "enregistré dans un commit"/"non-enregistré dans un commit" différents (dans le 2e cas, ça peut être un dossier "non suivi" ou "ignoré") ** il faut synchroniser a posteriori les repos enfants : si on oublie, on est alors dans un état intermédiaire entre deux commits * L’algorithme de fusion ne fusionne pas à l’intérieur des sous-modules *: Il faut fusionner chacun des sous-modules puis, lors de la fusion du repo parent, résoudre le conflit de fusion en préférant les commits fusionnés des repos enfants * Il n’y a pas d’ordre canonique dans le fichier .gitmodules *: Les commandes `git submodule add` ajoutent à la fin du fichier les nouveaux sous-modules *: En cas de fusion, même si deux fichiers .gitmodules sont sémantiquement identiques (mêmes sous-modules, mêmes paramètres pour chaque sous-module), il peut y avoir un conflit de fusion sur ce fichier * Lors du checkout, la référence HEAD des sous-modules pointe vers un commit et non vers la branche indiquée dans le fichier .gitmodules *: Il est moins aisé de mettre à jour en masse les sous-modules (par exemple dans MediaWiki, dans le principal dépôt d’extensions (Gerrit), les extensions MediaWiki sont dans des branches correspondant à la version majeure de MediaWiki (par exemple REL1_35 pour la branche majeure 1.35) : par défaut il n’est pas possible de faire un `git submodule foreach git fetch` ou `git iterate -- fetch` (programme complémentaire git-iterate) * Le support des sous-modules évolue (en s’améliorant amha) mais certaines commandes ou options de configuration n’étaient pas disponibles à l’origine *: Cela amoindrit la facilité d’utilisation pour les anciennes versions de Git === Monorepo === Méthode : * Faire un repo Git « parent » * Ajouter les repos Git « enfants » avec des `git clone` ou `git submodule add|init` dans des dossiers du repo parent * Faire un `git add .` dans le repo parent * Retirer les dossiers <enfant>/.git et <parent>/.git/modules * Faire des `git commit` dans le parent Avantages : * L’ensemble des fichiers est toujours cohérent (pas d’état intermédiaire comparé aux sous-modules, par exemple lorsqu’on change de branche sans faire un `git submodule update`) * Un `git clone` télécharge l’ensemble des fichiers Inconvénients : * Les historiques d’origine des enfants sont perdus *: Les liens avec les repos enfants étant perdus, ces dossiers vont évoluer de façon différente du repo "officiel", créant de facto des forks d18d3bf11f8f466248024de0f8bc9d61de109316 658123 658122 2021-07-19T16:38:03Z Seb35 1 +Monorepo avec des repos enfants via des espaces de noms et remote-ext wikitext text/x-wiki Cette page est une étude pour trouver la meilleure solution de faire un monorepo Git, ou plus exactement, idéalement, un repo Git qui serait à la fois : * un monorepo (qu’on puisse télécharger en une seule fois) * un multi-repo où certains dossiers serait des repo Git ayant leur historique autonome. Dans les contraintes imposées, il faut : * que les solutions potentielles soient possibles en l’état actuel de Git ou, a maximum, un programme Bourne shell d’une taille relativement faible (afin d’être compatible sur un maximum de plate-formes et qu’il reste lisible et compréhensible), * il peut y avoir une forme d’équivalence entre deux états "monorepo" et "multirepo" évenutuellement disticts mais switchable avec une commande, * les commandes standard Git devraient fonctionner, au moins dans un certain état "monorepo"/"multirepo" s’ils sont distincts, * la performance doit rester acceptable <small>(je sais, c’est vague et ça dépend des situations)</small>. == Cas d’usage == Les cas d’usage que je prévoie sont : * pour Archéo Lex : pouvoir aggréger l’ensemble des lois françaises dans un seul monorepo (au niveau stockage) mais en ayant la possibilité de télécharger seulement des sous-ensembles, par exemples les décrets, * pour MediaWiki : pouvoir avoir le logiciel de base (un repo) avec les extensions (chacun dans un repo) où le déploiement est un monorepo comportant la version de base + les extensions déployées dans une certaine version, éventuellement patchée. == Briques de base == Sous-modules Git (voir gitsubmodules(7)) ''alternates'' (voir gitrepository-layout(5)) Espaces de noms Git (voir gitnamespaces(7)) Dépôt distant de type ''ext'' (voir git-remote-ext(1)) Ilôts delta ''(delta islands)'' (voir git-pack-objects(1)) Les options de configuration, par exemple "diff.submodule" == Briques de solution == === Plusieurs repos indépendants === Ceci n’est pas une solution au problème exposé car il n’y a jamais de monorepo, au sens que la version globale et unifiée d’un repo et de ses sous-repos n’est jamais présente. C’est toutefois une partie d’une éventuelle solution, intégrée à une autre brique de solution. Méthode : * Faire un repo Git « parent » * Ajouter les repos Git « enfants » avec des `git clone` dans des dossiers du repo parent * Faire des `git commit` dans chacun des enfants et du parent … === Sous-modules classiques === Méthode : * Faire un repo Git « parent » * Ajouter les repos Git « enfants » *# Ajouter les sous-modules avec `git submodule add|init|update` *# Ajouter un repo Git normal dans un dossier, puis, dans le repo parent, faire un git-add(1) (il y a un avertissement, c’est normal), puis git-submodule(1) (absorbgitdirs) sur ce dossier pour transférer le dossier <enfant>/.git dans <parent>/.git/modules/<enfant> * `git commit` dans le repo parent pour enregistrer la version * `git submodule deinit` pour retirer le sous-module Avantages : * Très standard depuis longtemps, au moins pour l’organisation et les commandes de base * Gestion de la récursion (enfants d’enfants) * En local, tout l’historique est dans le dossier <parent>/.git Inconvénients : * Les repo enfants ne font pas partie du repo parent : *# En cas d’accès distant, il faut rendre les repos enfants accessibles *# En cas de clone du repo parent, seul le repo parent est téléchargé par défaut *#: Cela peut être changé au cas par cas avec `git clone --recurse-submodules` ou configuré de façon permanente avec "submodule.recurse", "fetch.recurseSubmodules" et "submodule.<name>.fetchRecurseSubmodules" *# Lors d’un push, il faut pousser aussi les repos enfants *#: Cela peut être changé au cas par cas avec `git push --recurse-submodules=check|on-demand|no` configuré de façon permanente avec "submodule.recurse" et "push.recurseSubmodules" *# La compression est donc dégradée par rapport à un object store global *# La perfomance lors d’un clone est dégradée par rapport à un clone global * En cas de changement de branche (pour un repo ayant un work tree) : ** il y a des avertissements si les branches source et destination ont des repos enfants ayant des statuts "enregistré dans un commit"/"non-enregistré dans un commit" différents (dans le 2e cas, ça peut être un dossier "non suivi" ou "ignoré") ** il faut synchroniser a posteriori les repos enfants : si on oublie, on est alors dans un état intermédiaire entre deux commits * L’algorithme de fusion ne fusionne pas à l’intérieur des sous-modules *: Il faut fusionner chacun des sous-modules puis, lors de la fusion du repo parent, résoudre le conflit de fusion en préférant les commits fusionnés des repos enfants * Il n’y a pas d’ordre canonique dans le fichier .gitmodules *: Les commandes `git submodule add` ajoutent à la fin du fichier les nouveaux sous-modules *: En cas de fusion, même si deux fichiers .gitmodules sont sémantiquement identiques (mêmes sous-modules, mêmes paramètres pour chaque sous-module), il peut y avoir un conflit de fusion sur ce fichier * Lors du checkout, la référence HEAD des sous-modules pointe vers un commit et non vers la branche indiquée dans le fichier .gitmodules *: Il est moins aisé de mettre à jour en masse les sous-modules (par exemple dans MediaWiki, dans le principal dépôt d’extensions (Gerrit), les extensions MediaWiki sont dans des branches correspondant à la version majeure de MediaWiki (par exemple REL1_35 pour la branche majeure 1.35) : par défaut il n’est pas possible de faire un `git submodule foreach git fetch` ou `git iterate -- fetch` (programme complémentaire git-iterate) * Le support des sous-modules évolue (en s’améliorant amha) mais certaines commandes ou options de configuration n’étaient pas disponibles à l’origine *: Cela amoindrit la facilité d’utilisation pour les anciennes versions de Git === Monorepo === Méthode : * Faire un repo Git « parent » * Ajouter les repos Git « enfants » avec des `git clone` ou `git submodule add|init` dans des dossiers du repo parent * Faire un `git add .` dans le repo parent * Retirer les dossiers <enfant>/.git et <parent>/.git/modules * Faire des `git commit` dans le parent Avantages : * L’ensemble des fichiers est toujours cohérent (pas d’état intermédiaire comparé aux sous-modules, par exemple lorsqu’on change de branche sans faire un `git submodule update`) * Un `git clone` télécharge l’ensemble des fichiers Inconvénients : * Les historiques d’origine des enfants sont perdus *: Les liens avec les repos enfants étant perdus, ces dossiers vont évoluer de façon différente du repo "officiel", créant de facto des forks === Monorepo avec des repos enfants via des espaces de noms et remote-ext === Méthode : * dans les repos enfants, créer des remote de type 'ext' pointant vers des namespaces refs/namespaces/gitmodules/refs/<enfant> dans le repo parent, faire un `git fetch` [à détailler] * dans le repo parent, ajouter des .git/objects/info/alternates pour qu’il n’y ait pas de transferts physiques entre les objectstore enfant et l’objectstore parent * ajouter de la glue pour que quand on commit dans un repo enfant, ça commit aussi le monorepo (possible?) Inconvénients : * Les remote de type 'ext' ne sont pas autorisés par défaut (voir git-remote-ext(1) et git-config(1) protocol.allow) 863b9f5753820153f3a75a7ebe3e8c824981d6c1 658127 658123 2021-07-31T21:46:32Z Seb35 1 wikitext text/x-wiki Cette page est une étude pour trouver la meilleure solution de faire un monorepo Git, ou plus exactement, idéalement, un repo Git qui serait à la fois : * un monorepo (qu’on puisse télécharger en une seule fois) * un multi-repo où certains dossiers serait des repo Git ayant leur historique autonome. Dans les contraintes imposées, il faut : * que les solutions potentielles soient possibles en l’état actuel de Git ou, a maximum, un programme Bourne shell d’une taille relativement faible (afin d’être compatible sur un maximum de plate-formes et qu’il reste lisible et compréhensible), * il peut y avoir une forme d’équivalence entre deux états "monorepo" et "multirepo" évenutuellement disticts mais switchable avec une commande, * les commandes standard Git devraient fonctionner, au moins dans un certain état "monorepo"/"multirepo" s’ils sont distincts, * la performance doit rester acceptable <small>(je sais, c’est vague et ça dépend des situations)</small>. == Cas d’usage == Les cas d’usage que je prévoie sont : * pour Archéo Lex : pouvoir aggréger l’ensemble des lois françaises dans un seul monorepo (au niveau stockage) mais en ayant la possibilité de télécharger seulement des sous-ensembles, par exemples les décrets, * pour MediaWiki : pouvoir avoir le logiciel de base (un repo) avec les extensions (chacun dans un repo) où le déploiement est un monorepo comportant la version de base + les extensions déployées dans une certaine version, éventuellement patchée. == Briques de base == Sous-modules Git (voir gitsubmodules(7)) ''alternates'' (voir gitrepository-layout(5)) Espaces de noms Git (voir gitnamespaces(7)) Dépôt distant de type ''ext'' (voir git-remote-ext(1)) Ilôts delta ''(delta islands)'' (voir git-pack-objects(1)) Les options de configuration, par exemple "diff.submodule" == Briques de solution == === Plusieurs repos indépendants === Ceci n’est pas une solution au problème exposé car il n’y a jamais de monorepo, au sens que la version globale et unifiée d’un repo et de ses sous-repos n’est jamais présente. C’est toutefois une partie d’une éventuelle solution, intégrée à une autre brique de solution. Méthode : * Faire un repo Git « parent » * Ajouter les repos Git « enfants » avec des `git clone` dans des dossiers du repo parent * Faire des `git commit` dans chacun des enfants et du parent … === Sous-modules classiques === Méthode : * Faire un repo Git « parent » * Ajouter les repos Git « enfants » *# Ajouter les sous-modules avec `git submodule add|init|update` *# Ajouter un repo Git normal dans un dossier, puis, dans le repo parent, faire un git-add(1) (il y a un avertissement, c’est normal), puis git-submodule(1) (absorbgitdirs) sur ce dossier pour transférer le dossier <enfant>/.git dans <parent>/.git/modules/<enfant> * `git commit` dans le repo parent pour enregistrer la version * `git submodule deinit` pour retirer le sous-module Avantages : * Très standard depuis longtemps, au moins pour l’organisation et les commandes de base * Gestion de la récursion (enfants d’enfants) * En local, tout l’historique est dans le dossier <parent>/.git Inconvénients : * Les repo enfants ne font pas partie du repo parent : *# En cas d’accès distant, il faut rendre les repos enfants accessibles *# En cas de clone du repo parent, seul le repo parent est téléchargé par défaut *#: Cela peut être changé au cas par cas avec `git clone --recurse-submodules` ou configuré de façon permanente avec "submodule.recurse", "fetch.recurseSubmodules" et "submodule.<name>.fetchRecurseSubmodules" *# Lors d’un push, il faut pousser aussi les repos enfants *#: Cela peut être changé au cas par cas avec `git push --recurse-submodules=check|on-demand|no` configuré de façon permanente avec "submodule.recurse" et "push.recurseSubmodules" *# La compression est donc dégradée par rapport à un object store global *# La perfomance lors d’un clone est dégradée par rapport à un clone global * En cas de changement de branche (pour un repo ayant un work tree) : ** il y a des avertissements si les branches source et destination ont des repos enfants ayant des statuts "enregistré dans un commit"/"non-enregistré dans un commit" différents (dans le 2e cas, ça peut être un dossier "non suivi" ou "ignoré") ** il faut synchroniser a posteriori les repos enfants : si on oublie, on est alors dans un état intermédiaire entre deux commits * L’algorithme de fusion ne fusionne pas à l’intérieur des sous-modules *: Il faut fusionner chacun des sous-modules puis, lors de la fusion du repo parent, résoudre le conflit de fusion en préférant les commits fusionnés des repos enfants * Il n’y a pas d’ordre canonique dans le fichier .gitmodules *: Les commandes `git submodule add` ajoutent à la fin du fichier les nouveaux sous-modules *: En cas de fusion, même si deux fichiers .gitmodules sont sémantiquement identiques (mêmes sous-modules, mêmes paramètres pour chaque sous-module), il peut y avoir un conflit de fusion sur ce fichier * Lors du checkout, la référence HEAD des sous-modules pointe vers un commit et non vers la branche indiquée dans le fichier .gitmodules *: Il est moins aisé de mettre à jour en masse les sous-modules (par exemple dans MediaWiki, dans le principal dépôt d’extensions (Gerrit), les extensions MediaWiki sont dans des branches correspondant à la version majeure de MediaWiki (par exemple REL1_35 pour la branche majeure 1.35) : par défaut il n’est pas possible de faire un `git submodule foreach git fetch` ou `git iterate -- fetch` (programme complémentaire git-iterate) * Le support des sous-modules évolue (en s’améliorant amha) mais certaines commandes ou options de configuration n’étaient pas disponibles à l’origine *: Cela amoindrit la facilité d’utilisation pour les anciennes versions de Git === Monorepo === Méthode : * Faire un repo Git « parent » * Ajouter les repos Git « enfants » avec des `git clone` ou `git submodule add|init` dans des dossiers du repo parent * Faire un `git add .` dans le repo parent * Retirer les dossiers <enfant>/.git et <parent>/.git/modules * Faire des `git commit` dans le parent Avantages : * L’ensemble des fichiers est toujours cohérent (pas d’état intermédiaire comparé aux sous-modules, par exemple lorsqu’on change de branche sans faire un `git submodule update`) * Un `git clone` télécharge l’ensemble des fichiers Inconvénients : * Les historiques d’origine des enfants sont perdus *: Les liens avec les repos enfants étant perdus, ces dossiers vont évoluer de façon différente du repo "officiel", créant de facto des forks === Monorepo avec des repos enfants via des espaces de noms et remote-ext === Méthode : * dans les repos enfants, créer des remote de type 'ext' pointant vers des namespaces refs/namespaces/gitmodules/refs/<enfant> dans le repo parent, faire un `git fetch` [à détailler] * dans le repo parent, ajouter des .git/objects/info/alternates pour qu’il n’y ait pas de transferts physiques entre les objectstore enfant et l’objectstore parent * ajouter de la glue pour que quand on commit dans un repo enfant, ça commit aussi le monorepo (possible?) Inconvénients : * Les remote de type 'ext' ne sont pas autorisés par défaut (voir git-remote-ext(1) et git-config(1) protocol.allow) === Multi-repo stocké dans un monorepo === <syntaxhighlight lang="sh"> git init git remote add <url> <dossier> git branch <sousrepo1> … git submodule add -b <sousrepo1> ./ <sousdossier1> git commit </syntaxhighlight> Cela crée un sous-repo via un sous-module stocké dans une branche du monorepo, ce qui est une solution quasi-parfaite (dans ses grandes lignes) à mon sens : * tout est stocké et téléchargé via le monorepo * chaque sous-repo a un historique autonome (lié au repo parent par le numéro de commit comme classiquement avec les sous-modules) Pour aller légèrement plus loin, j’aurais aimé qu’on puisse appeler, à la place d’une branche du repo parent, une référence du repo parent, mais ça ne semble pas possible [https://git-scm.com/docs/git-clone/fr] (cela éviterait que la commande classique "git branch" n’affiche par défaut les "sous-repo"). 2f833c9719e44faaec87e97287ca79a88ae2cc64 PrivateBin 0 198 658124 2021-07-31T17:53:22Z Seb35 1 doc d’installation wikitext text/x-wiki Doc sysadmin de [https://github.com/PrivateBin/PrivateBin PrivateBin] (pastebin avec données chiffrées côté client et stockées sur le serveur). Je l’avais installé pour test sur mon domaine https://privatebin.seb35.fr mais ne l’utilisant pas, je le désinstalle. Cette doc devrait permettre une éventuelle réinstallation (sur Debian avec nginx + PHP). <syntaxhighlight lang="sh"> git clone https://github.com/PrivateBin/PrivateBin.git /opt/privatebin cd /opt/privatebin chown -R root: . chgrp -R www-data data chmod -R g+w data </syntaxhighlight> ; /etc/nginx/sites-enabled/privatebin.seb35.fr <syntaxhighlight lang="text"> server { listen 443 ssl; listen [::]:443 ssl; server_name privatebin.seb35.fr; root /opt/privatebin; index index.php; # TLS ssl_certificate /etc/ssl/private/privatebin.pem; ssl_certificate_key /etc/ssl/private/privatebin.key.pem; add_header Strict-Transport-Security "max-age=622080000"; ssl_session_timeout 1h; deny all; location = / { allow all; include php7.0-fpm.conf; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param SCRIPT_NAME /index.php; } location /css/ { allow all; try_files $uri =404; } location /img/ { allow all; try_files $uri =404; } location /i18n/ { allow all; try_files $uri =404; } location /js/ { allow all; try_files $uri =404; } location /browserconfig.xml { allow all; try_files $uri =404; } location /robots.txt { allow all; try_files $uri =404; } } </syntaxhighlight> dd76694ec5c9383d564c78dd2288d4a796c58188 658125 658124 2021-07-31T17:58:37Z Seb35 1 wikitext text/x-wiki Doc sysadmin de [https://github.com/PrivateBin/PrivateBin PrivateBin] ([https://privatebin.info site officiel]) (pastebin avec données chiffrées côté client et stockées sur le serveur). Je l’avais installé pour test sur mon domaine https://privatebin.seb35.fr mais ne l’utilisant pas, je le désinstalle. Cette doc devrait permettre une éventuelle réinstallation (sur Debian avec nginx + PHP). <syntaxhighlight lang="sh"> git clone https://github.com/PrivateBin/PrivateBin.git /opt/privatebin cd /opt/privatebin chown -R root: . chgrp -R www-data data chmod -R g+w data </syntaxhighlight> ; /etc/nginx/sites-enabled/privatebin.seb35.fr <syntaxhighlight lang="text"> server { listen 443 ssl; listen [::]:443 ssl; server_name privatebin.seb35.fr; root /opt/privatebin; index index.php; # TLS ssl_certificate /etc/ssl/private/privatebin.pem; ssl_certificate_key /etc/ssl/private/privatebin.key.pem; add_header Strict-Transport-Security "max-age=622080000"; ssl_session_timeout 1h; deny all; location = / { allow all; include php7.0-fpm.conf; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param SCRIPT_NAME /index.php; } location /css/ { allow all; try_files $uri =404; } location /img/ { allow all; try_files $uri =404; } location /i18n/ { allow all; try_files $uri =404; } location /js/ { allow all; try_files $uri =404; } location /browserconfig.xml { allow all; try_files $uri =404; } location /robots.txt { allow all; try_files $uri =404; } } </syntaxhighlight> 004339ba7f7d286c50ef1bb24f686979dd2a8845 Archéo Lex/Repo Git 0 199 658128 2021-08-10T12:17:27Z Seb35 1 Page créée avec « Cette page fait état de l’architecture du/des repos Git créés par Archéo Lex, eu égard des contraintes (performance, stockage) et des usages possibles. == Existant... » wikitext text/x-wiki Cette page fait état de l’architecture du/des repos Git créés par Archéo Lex, eu égard des contraintes (performance, stockage) et des usages possibles. == Existant == === État des lieux === Actuellement, Archéo Lex crée un repo par texte et a trois variantes de repo (paramètre --organisation) : * la principale est de placer tous le texte en Markdown dans un seul fichier texte ; * la seconde est de placer le contenu des articles dans des fichiers autonomes, à plat dans le dossier principal ; * la troisième est de créer des sous-dossiers par section/sous-section du texte et de placer le contenu des articles dans des fichiers dans cette arborescence. Il y a 1 ou 2 références par texte : * "texte" (ou "sections" ou "articles") : le texte en vigueur * "texte-futur" (ou "sections-futur" ou "articles-futur") : le texte en vigueur future (=prévu à une date future, par exemple au 1er janvier de l’année prochaine) === Problèmes === ==== Ordre de grandeur ==== Cette organisation est adaptée pour les codes étant donné leur faible nombre (≈108 dont ≈74 en vigueur) : il n’y a que 1 ou 2 références par repo, ce qui ne pose pas de problèmes de performances. Il est possible de créer un repo "codes" comprenant tous les codes (ou tous les codes en vigueur selon ce qu’on veut exposer), ce qui ne fait que ≈200 références. Toutefois, si on cherche (et c’est le cas) à généraliser Archéo Lex aux lois (≈12600<ref group="problemes-sur-l-existant">12595 avec nature='LOI' dans la base JORF au 9 février 2019 via [https://github.com/Legilibre/legi.py/issues/33 cette PR]</ref> dont entre 2,7k et 12k en vigueur<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 2746 lois en vigueur, 500 abrogrés, peu avec des statuts autres, total de 3331 lois ; il manque donc au moins ≈7000 lois dans la base LEGI dont on ne connait pas le statut abrogation ou vigueur</ref>), il peut y avoir des problèmes de performances d’autant plus qu’on ajoute les décrets (50k décrets dans LEGI, 200k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 49129 décrets dont 38287 en vigueur, 8066 abrogés, 1238 périmés, quelques dizaines pour les autres statuts. Au 9 février 2019 dans la base JORF : 204051 décrets.</ref>) ou les arrêtés (70k dans LEGI, 600k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 69812 arrêtés dont 53051 en vigueur, 12328 abrogés, 2306 périmés, quelques dizaines ou centaines dans les autres statuts. Au 9 février 2019 dans la base JORF : 606909 arrêtés.</ref>). <div style="border:1px solid gray; padding: 0 1em;"> '''Notes''' <references group="problemes-sur-l-existant" /> </div> ==== Fichier des références packed-refs ==== Le problème de performance est en partie sur le ''fichier des références packed-refs'' lors de son écriture. Celui-ci est un fichier texte dont la 1ère colonne sont des SHA-1 (40 octets) et la 2e colonne sont les refs correspondantes (longueur variable, probablement autour de 30 octets puisque les références seraient nommées comme refs/lois/loi_2021-689/texte (28 caractères) ou refs/décrets/décret_2021-699/texte (36 caractères)) ; ce fichier est trié, la 2e colonne étant la clé (il y a donc une problématique de tri lors de l’écriture de ce fichier). Sa taille est donc environ 70 octets x (nombre de textes) = 14 Mo pour 200k décrets. Cela reste gérable si on ne conserve pas les versions passées des références (on a que la base LEGI+JORF du jour), mais n’est plus gérable si on veut garder les références de chaque texte des bases LEGI+JORF pour chaque jour (par ex. refs/codes/code_civil/texte/markdown/20181019-200412/vigueur), ou alors il ne faut stocker que les quelques textes mis à jour (et avoir un mécanisme pour requêter la base LEGI de n’importe quel jour en allant chercher la plus récente référence du texte avant ce jour). ==== Protocole ''smart'' de Git ==== Lors d’un essai sur un gros repo git avec de nombreuses références, j’ai expérimenté un échange interminable où le client dit qu’il a telle et telle référence (have xxxx [https://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols]) (c’était il y a 1 ou 2 ans, je crois qu’il y a un nouveau mécanisme pour optimiser cette étape). 2789d41bdc0266cc141344f34834722d6b722cb5 658129 658128 2021-08-10T16:12:15Z Seb35 1 wikitext text/x-wiki Cette page fait état de l’architecture du/des repos Git créés par Archéo Lex, eu égard des contraintes (performance, stockage) et des usages possibles. Voir aussi [[Monorepo Git]]. NB : * ''repo'' = repository = dépôt Git * ''repos'' = pluriel de ''repo'' == Existant == === État des lieux === Actuellement, Archéo Lex crée un repo par texte et a trois variantes de repo (paramètre --organisation) : * la principale est de placer tous le texte en Markdown dans un seul fichier texte ; * la seconde est de placer le contenu des articles dans des fichiers autonomes, à plat dans le dossier principal ; * la troisième est de créer des sous-dossiers par section/sous-section du texte et de placer le contenu des articles dans des fichiers dans cette arborescence. Il y a 1 ou 2 références par texte : * "texte" (ou "sections" ou "articles") : le texte en vigueur * "texte-futur" (ou "sections-futur" ou "articles-futur") : le texte en vigueur future (=prévu à une date future, par exemple au 1er janvier de l’année prochaine) === Problèmes === ==== Ordre de grandeur ==== Cette organisation est adaptée pour les codes étant donné leur faible nombre (≈108 dont ≈74 en vigueur) : il n’y a que 1 ou 2 références par repo, ce qui ne pose pas de problèmes de performances. Il est possible de créer un repo "codes" comprenant tous les codes (ou tous les codes en vigueur selon ce qu’on veut exposer), ce qui ne fait que ≈200 références. Toutefois, si on cherche (et c’est le cas) à généraliser Archéo Lex aux lois (≈12600<ref group="problemes-sur-l-existant">12595 avec nature='LOI' dans la base JORF au 9 février 2019 via [https://github.com/Legilibre/legi.py/issues/33 cette PR]</ref> dont entre 2,7k et 12k en vigueur<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 2746 lois en vigueur, 500 abrogrés, peu avec des statuts autres, total de 3331 lois ; il manque donc au moins ≈7000 lois dans la base LEGI dont on ne connait pas le statut abrogation ou vigueur</ref>), il peut y avoir des problèmes de performances d’autant plus qu’on ajoute les décrets (50k décrets dans LEGI, 200k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 49129 décrets dont 38287 en vigueur, 8066 abrogés, 1238 périmés, quelques dizaines pour les autres statuts. Au 9 février 2019 dans la base JORF : 204051 décrets.</ref>) ou les arrêtés (70k dans LEGI, 600k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 69812 arrêtés dont 53051 en vigueur, 12328 abrogés, 2306 périmés, quelques dizaines ou centaines dans les autres statuts. Au 9 février 2019 dans la base JORF : 606909 arrêtés.</ref>). <div style="border:1px solid gray; padding: 0 1em;"> '''Notes''' <references group="problemes-sur-l-existant" /> </div> ==== Fichier des références packed-refs ==== Le problème de performance est en partie sur le ''fichier des références packed-refs'' lors de son écriture. Celui-ci est un fichier texte dont la 1ère colonne sont des SHA-1 (40 octets) et la 2e colonne sont les refs correspondantes (longueur variable, probablement autour de 30 octets puisque les références seraient nommées comme refs/lois/loi_2021-689/texte (28 caractères) ou refs/décrets/décret_2021-699/texte (36 caractères)) ; ce fichier est trié, la 2e colonne étant la clé (il y a donc une problématique de tri lors de l’écriture de ce fichier). Sa taille est donc environ 70 octets x (nombre de textes) = 14 Mo pour 200k décrets. Cela reste gérable en taille (mais ça commence à faire vraiment beaucoup en nombre de refs) si on ne conserve pas les versions passées des références (on a que la base LEGI+JORF du jour), mais n’est plus gérable si on veut garder les références de chaque texte des bases LEGI+JORF pour chaque jour (par ex. refs/codes/code_civil/texte/markdown/20181019-200412/vigueur), ou alors il ne faut stocker que les quelques textes mis à jour (et avoir un mécanisme pour requêter la base LEGI de n’importe quel jour en allant chercher la plus récente référence du texte avant ce jour). Voir aussi [https://github.com/git/git/blob/master/Documentation/technical/reftable.txt reftable] en cours d’implémentation dans Git (2021), qui optimisera l’accès aux références : temps constant quel que soit le nombre de références au lieu du temps linéaire actuel + enregistrement incrémental au lieu de l’enregistrement global actuel. Les ordres de grandeur donnés dans la spec reftable est 31k refs pour rails et 866k refs pour android. Le stockage des reflogs est géré également selon le même mécanisme. ==== Protocole ''smart'' de Git ==== Lors d’un essai sur un gros repo git avec de nombreuses références, j’ai expérimenté un échange interminable où le client dit qu’il a telle et telle référence (have xxxx [https://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols]) (c’était il y a 1 ou 2 ans, je crois qu’il y a un nouveau mécanisme pour optimiser cette étape). == Future architecture == === v2 === 1) Conserver les 3 organisations actuelles des fichiers ("texte", "sections", "articles"), cela est éprouvé même si on peut améliorer à la marge (par exemple : noms des fichiers lorsque ça dépasse 255 caractères en ajoutant un sommaire, etc.) 2) Utiliser les reflogs pour stocker l’historique du repo -- confirmer que ça serait suffisamment adapté, notamment : # pour retrouver l’état d’une ref à une date passée, # pour fixer la date de changement de la ref (fixer au jour d’entrée en vigueur minuit même si on exécute la commande à 22:50:25 la veille), # optionnellement pour créer des packfiles "historiques" contenant les très anciennes versions des références 3) Continuer à servir publiquement des repos "codes/code_civil.git" et y ajouter "lois/loi_2021-689.git" et "décrets/décret_2021-699.git" : cela est utile pour SedLex quand on veut consolider un texte (par ex. un amendement qui modifie la version en vigueur du code civil). L’implémentation côté serveur reste à déterminer. 4) Servir publiquement des repos "lois.git", "décrets.git" contenant des sous-modules par année "lois/2020.git", "décrets/2020.git", liant vers les repos autonomes ci-dessus (pour le repo "codes.git" : directement les respos autonomes). Les mises à jour de ces repos seraient relativement rapides : seuls les sous-modules par année modifiée seraient mis à jour, et il y a actuellement dans LEGI 50 lois/an, 1500 décrets/an, 3000 arrêtés/an. Possiblement, dans une version intégrée, les sous-modules par année pourraient être des branches du repo parent afin de tout télécharger en même temps (et non télécharger à N+1 repos) ; j’ai testé récemment avec Git 2.30, c’est possible avec une URL de sous-module de la forme "./" (et il faut que l’objet commit du sous-module soit dans le repo courant, d’où la nécessité que ce soit dans une branche ou un tag). La granularité "année" peut être changée en "mois" voire "jour" pour mettre par exemple les décrets datés du 21 juin 2020 dans le repo "décrets/2020/06/21.git" (noter que, vu le processus de consolidation, les sous-modules évolueront quelque soit la granularité vis-à-vis de leur date de publication). Plus la granularité est forte, moins chaque sous-module sera mis à jour (mais plus le téléchargement initial mettra de temps puisqu’il faudra télécharger plus de repos distincts). Un panachage du stockage peut être introduit : par exemple stockage des sous-modules par année dans le repo principal, puis téléchargement distant des sous-modules par mois. Une version plus évoluée pourrait être que, pour une granularité "mois", les 3 derniers mois sont stockés dans des branches (donc téléchargés d’office initialement) et les plus anciens sont téléchargeables au cas par cas ; dans cette configuration, cela demande côté client de changer la configuration ".git/config" puisque les branches du mois vont disparaître du repo principal avec le temps et il faudra alors les télécharger explicitement. Côté serveur, il serait possible d’utiliser les "gitnamespaces" [https://git-scm.com/docs/gitnamespaces] avec une certaine configuration nginx pour stocker efficacement ces repos dans un seul repo (ou 2 ou 3 par granularité, à tester vis-à-vis de la performance), et la performance devrait rester acceptable au moins jusqu’à une granularité du mois (250 ans x 12 mois + 250 sommaires = 3250 refs). a9f507d9c0849df8f42440926fa2b85bf5e6c6aa 658130 658129 2021-08-10T17:30:32Z Seb35 1 typo wikitext text/x-wiki Cette page fait état de l’architecture du/des repos Git créés par Archéo Lex, eu égard des contraintes (performance, stockage) et des usages possibles. Voir aussi [[Monorepo Git]]. NB : * ''repo'' = repository = dépôt Git * ''repos'' = pluriel de ''repo'' == Existant == === État des lieux === Actuellement, Archéo Lex crée un repo par texte et a trois variantes de repo (paramètre --organisation) : * la principale est de placer tous le texte en Markdown dans un seul fichier texte ; * la seconde est de placer le contenu des articles dans des fichiers autonomes, à plat dans le dossier principal ; * la troisième est de créer des sous-dossiers par section/sous-section du texte et de placer le contenu des articles dans des fichiers dans cette arborescence. Il y a 1 ou 2 références par texte : * "texte" (ou "sections" ou "articles") : le texte en vigueur * "texte-futur" (ou "sections-futur" ou "articles-futur") : le texte en vigueur future (=prévu à une date future, par exemple au 1er janvier de l’année prochaine) === Problèmes === ==== Ordre de grandeur ==== Cette organisation est adaptée pour les codes étant donné leur faible nombre (≈108 dont ≈74 en vigueur) : il n’y a que 1 ou 2 références par repo, ce qui ne pose pas de problèmes de performances. Il est possible de créer un repo "codes" comprenant tous les codes (ou tous les codes en vigueur selon ce qu’on veut exposer), ce qui ne fait que ≈200 références. Toutefois, si on cherche (et c’est le cas) à généraliser Archéo Lex aux lois (≈12600<ref group="problemes-sur-l-existant">12595 avec nature='LOI' dans la base JORF au 9 février 2019 via [https://github.com/Legilibre/legi.py/issues/33 cette PR]</ref> dont entre 2,7k et 12k en vigueur<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 2746 lois en vigueur, 500 abrogrés, peu avec des statuts autres, total de 3331 lois ; il manque donc au moins ≈7000 lois dans la base LEGI dont on ne connait pas le statut abrogation ou vigueur</ref>), il peut y avoir des problèmes de performances d’autant plus qu’on ajoute les décrets (50k décrets dans LEGI, 200k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 49129 décrets dont 38287 en vigueur, 8066 abrogés, 1238 périmés, quelques dizaines pour les autres statuts. Au 9 février 2019 dans la base JORF : 204051 décrets.</ref>) ou les arrêtés (70k dans LEGI, 600k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 69812 arrêtés dont 53051 en vigueur, 12328 abrogés, 2306 périmés, quelques dizaines ou centaines dans les autres statuts. Au 9 février 2019 dans la base JORF : 606909 arrêtés.</ref>). <div style="border:1px solid gray; padding: 0 1em;"> '''Notes''' <references group="problemes-sur-l-existant" /> </div> ==== Fichier des références packed-refs ==== Le problème de performance est en partie sur le ''fichier des références packed-refs'' lors de son écriture. Celui-ci est un fichier texte dont la 1ère colonne sont des SHA-1 (40 octets) et la 2e colonne sont les refs correspondantes (longueur variable, probablement autour de 30 octets puisque les références seraient nommées comme refs/lois/loi_2021-689/texte (28 caractères) ou refs/décrets/décret_2021-699/texte (36 caractères)) ; ce fichier est trié, la 2e colonne étant la clé (il y a donc une problématique de tri lors de l’écriture de ce fichier). Sa taille est donc environ 70 octets x (nombre de textes) = 14 Mo pour 200k décrets. Cela reste gérable en taille (mais ça commence à faire vraiment beaucoup en nombre de refs) si on ne conserve pas les versions passées des références (on a que la base LEGI+JORF du jour), mais n’est plus gérable si on veut garder les références de chaque texte des bases LEGI+JORF pour chaque jour (par ex. refs/codes/code_civil/texte/markdown/20181019-200412/vigueur), ou alors il ne faut stocker que les quelques textes mis à jour (et avoir un mécanisme pour requêter la base LEGI de n’importe quel jour en allant chercher la plus récente référence du texte avant ce jour). Voir aussi [https://github.com/git/git/blob/master/Documentation/technical/reftable.txt reftable] en cours d’implémentation dans Git (2021), qui optimisera l’accès aux références : temps constant quel que soit le nombre de références au lieu du temps linéaire actuel + enregistrement incrémental au lieu de l’enregistrement global actuel. Les ordres de grandeur donnés dans la spec reftable est 31k refs pour rails et 866k refs pour android. Le stockage des reflogs est géré également selon le même mécanisme. ==== Protocole ''smart'' de Git ==== Lors d’un essai sur un gros repo git avec de nombreuses références, j’ai expérimenté un échange interminable où le client dit qu’il a telle et telle référence (have xxxx [https://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols]) (c’était il y a 1 ou 2 ans, je crois qu’il y a un nouveau mécanisme pour optimiser cette étape). == Future architecture == === v2 === 1) Conserver les '''3 organisations actuelles des fichiers''' ("texte", "sections", "articles"), cela est éprouvé même si on peut améliorer à la marge (par exemple : noms des fichiers lorsque ça dépasse 255 caractères en ajoutant un sommaire, etc.). Sur la publication sur archeo-lex.fr, je pense publier uniquement l’organisation "texte" qui ne souffre pas de limitations sur le nommage des articles et est plus éprouvée jusqu’à présent. 2) '''Utiliser les reflogs pour stocker l’historique du repo''' -- confirmer que ça serait suffisamment adapté, notamment : # pour retrouver l’état d’une ref à une date passée, # pour fixer la date de changement de la ref (fixer au jour d’entrée en vigueur minuit même si on exécute la commande à 22:50:25 la veille), # optionnellement pour créer des packfiles "historiques" contenant les très anciennes versions des références 3) Continuer à '''servir publiquement des repos "codes/code_civil.git" et y ajouter "lois/loi_2021-689.git" et "décrets/décret_2021-699.git"''' : cela est utile pour SedLex quand on veut consolider un texte (par ex. un amendement qui modifie la version en vigueur du code civil). L’implémentation côté serveur reste à déterminer. 4) Servir '''publiquement des repos "lois.git" et "décrets.git"''' contenant des sous-modules par année "lois/2020.git", "décrets/2020.git", liant vers les repos autonomes ci-dessus (pour le repo "codes.git" : directement les respos autonomes). Les mises à jour de ces repos seraient relativement rapides : seuls les sous-modules par année modifiée seraient mis à jour, et il y a actuellement dans LEGI 50 lois/an, 1500 décrets/an, 3000 arrêtés/an. Possiblement, dans une version intégrée, les sous-modules par année pourraient être des branches du repo parent afin de tout télécharger en même temps (et non télécharger à N+1 repos) ; j’ai testé récemment avec Git 2.30, c’est possible avec une URL de sous-module de la forme "./" (et il faut que l’objet commit du sous-module soit dans le repo courant, d’où la nécessité que ce soit dans une branche ou un tag). La granularité "année" peut être changée en "mois" voire "jour" pour mettre par exemple les décrets datés du 21 juin 2020 dans le repo "décrets/2020/06/21.git" (noter que, vu le processus de consolidation, les sous-modules évolueront quelque soit la granularité vis-à-vis de leur date de publication). Plus la granularité est forte, moins chaque sous-module sera mis à jour (mais plus le téléchargement initial mettra de temps puisqu’il faudra télécharger plus de repos distincts). Un panachage du stockage peut être introduit : par exemple stockage des sous-modules par année dans le repo principal, puis téléchargement distant des sous-modules par mois. Une version plus évoluée pourrait être que, pour une granularité "mois", les 3 derniers mois sont stockés dans des branches (donc téléchargés d’office initialement) et les plus anciens sont téléchargeables au cas par cas ; dans cette configuration, cela demande côté client de changer la configuration ".git/config" puisque les branches du mois vont disparaître du repo principal avec le temps et il faudra alors les télécharger explicitement. Côté serveur, il serait possible d’utiliser les "gitnamespaces" [https://git-scm.com/docs/gitnamespaces] avec une certaine configuration nginx pour stocker efficacement ces repos dans un seul repo (ou 2 ou 3 par granularité, à tester vis-à-vis de la performance), et la performance devrait rester acceptable au moins jusqu’à une granularité du mois (250 ans x 12 mois + 250 sommaires = 3250 refs). 5a65994e863a522774be32483f4de8e4510038fe 658131 658130 2021-08-10T17:34:09Z Seb35 1 wikitext text/x-wiki Cette page fait état de l’architecture du/des repos Git créés par Archéo Lex, eu égard des contraintes (performance, stockage) et des usages possibles. Voir aussi [[Monorepo Git]]. NB : * ''repo'' = repository = dépôt Git * ''repos'' = pluriel de ''repo'' == Existant == === État des lieux === Actuellement, Archéo Lex crée un repo par texte et a trois variantes de repo (paramètre --organisation) : * la principale est de placer tous le texte en Markdown dans un seul fichier texte ; * la seconde est de placer le contenu des articles dans des fichiers autonomes, à plat dans le dossier principal ; * la troisième est de créer des sous-dossiers par section/sous-section du texte et de placer le contenu des articles dans des fichiers dans cette arborescence. Il y a 1 ou 2 références par texte : * "texte" (ou "sections" ou "articles") : le texte en vigueur * "texte-futur" (ou "sections-futur" ou "articles-futur") : le texte en vigueur future (=prévu à une date future, par exemple au 1er janvier de l’année prochaine) === Problèmes === ==== Ordre de grandeur ==== Cette organisation est adaptée pour les codes étant donné leur faible nombre (≈108 dont ≈74 en vigueur) : il n’y a que 1 ou 2 références par repo, ce qui ne pose pas de problèmes de performances. Il est possible de créer un repo "codes" comprenant tous les codes (ou tous les codes en vigueur selon ce qu’on veut exposer), ce qui ne fait que ≈200 références. Toutefois, si on cherche (et c’est le cas) à généraliser Archéo Lex aux lois (≈12600<ref group="problemes-sur-l-existant">12595 avec nature='LOI' dans la base JORF au 9 février 2019 via [https://github.com/Legilibre/legi.py/issues/33 cette PR]</ref> dont entre 2,7k et 12k en vigueur<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 2746 lois en vigueur, 500 abrogrés, peu avec des statuts autres, total de 3331 lois ; il manque donc au moins ≈7000 lois dans la base LEGI dont on ne connait pas le statut abrogation ou vigueur</ref>), il peut y avoir des problèmes de performances d’autant plus qu’on ajoute les décrets (50k décrets dans LEGI, 200k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 49129 décrets dont 38287 en vigueur, 8066 abrogés, 1238 périmés, quelques dizaines pour les autres statuts. Au 9 février 2019 dans la base JORF : 204051 décrets.</ref>) ou les arrêtés (70k dans LEGI, 600k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 69812 arrêtés dont 53051 en vigueur, 12328 abrogés, 2306 périmés, quelques dizaines ou centaines dans les autres statuts. Au 9 février 2019 dans la base JORF : 606909 arrêtés.</ref>). <div style="border:1px solid gray; padding: 0 1em;"> '''Notes''' <references group="problemes-sur-l-existant" /> </div> ==== Fichier des références packed-refs ==== Le problème de performance est en partie sur le ''fichier des références packed-refs'' lors de son écriture. Celui-ci est un fichier texte dont la 1ère colonne sont des SHA-1 (40 octets) et la 2e colonne sont les refs correspondantes (longueur variable, probablement autour de 30 octets puisque les références seraient nommées comme refs/lois/loi_2021-689/texte (28 caractères) ou refs/décrets/décret_2021-699/texte (36 caractères)) ; ce fichier est trié, la 2e colonne étant la clé (il y a donc une problématique de tri lors de l’écriture de ce fichier). Sa taille est donc environ 70 octets x (nombre de textes) = 14 Mo pour 200k décrets. Cela reste gérable en taille (mais ça commence à faire vraiment beaucoup en nombre de refs) si on ne conserve pas les versions passées des références (on a que la base LEGI+JORF du jour), mais n’est plus gérable si on veut garder les références de chaque texte des bases LEGI+JORF pour chaque jour (par ex. refs/codes/code_civil/texte/markdown/20181019-200412/vigueur), ou alors il ne faut stocker que les quelques textes mis à jour (et avoir un mécanisme pour requêter la base LEGI de n’importe quel jour en allant chercher la plus récente référence du texte avant ce jour). Voir aussi [https://github.com/git/git/blob/master/Documentation/technical/reftable.txt reftable] en cours d’implémentation dans Git (2021), qui optimisera l’accès aux références : temps constant quel que soit le nombre de références au lieu du temps linéaire actuel + enregistrement incrémental au lieu de l’enregistrement global actuel. Les ordres de grandeur donnés dans la spec reftable est 31k refs pour rails et 866k refs pour android. Le stockage des reflogs est géré également selon le même mécanisme. ==== Protocole ''smart'' de Git ==== Lors d’un essai sur un gros repo git avec de nombreuses références, j’ai expérimenté un échange interminable où le client dit qu’il a telle et telle référence (have xxxx [https://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols]) (c’était il y a 1 ou 2 ans, je crois qu’il y a un nouveau mécanisme pour optimiser cette étape). == Future architecture == === v2 === 1) Conserver les '''3 organisations actuelles des fichiers''' ("texte", "sections", "articles"), cela est éprouvé même si on peut améliorer à la marge (par exemple : noms des fichiers lorsque ça dépasse 255 caractères en ajoutant un sommaire, etc.). Sur la publication sur archeo-lex.fr, je pense publier uniquement l’organisation "texte" qui ne souffre pas de limitations sur le nommage des articles et est plus éprouvée jusqu’à présent. 2) Conserver les '''2 noms de branches relatifs à la vigueur du texte''' ("texte" et "texte-futur", etc pour les autres organisations des fichiers), cela est éprouvé et permet de savoir quasi-immédiatement le statut de vigueur du texte (la seule ambiguité est si le texte est abrogé : il y a une branche "texte" ne contenant aucun fichier). 3) '''Utiliser les reflogs pour stocker l’historique du repo''' -- confirmer que ça serait suffisamment adapté, notamment : # pour retrouver l’état d’une ref à une date passée, # pour fixer la date de changement de la ref (fixer au jour d’entrée en vigueur minuit même si on exécute la commande à 22:50:25 la veille), # optionnellement pour créer des packfiles "historiques" contenant les très anciennes versions des références 4) Continuer à '''servir publiquement des repos "codes/code_civil.git" et y ajouter "lois/loi_2021-689.git" et "décrets/décret_2021-699.git"''' : cela est utile pour SedLex quand on veut consolider un texte (par ex. un amendement qui modifie la version en vigueur du code civil). L’implémentation côté serveur reste à déterminer. 5) Servir '''publiquement des repos "lois.git" et "décrets.git"''' contenant des sous-modules par année "lois/2020.git", "décrets/2020.git", liant vers les repos autonomes ci-dessus (pour le repo "codes.git" : directement les respos autonomes). Les mises à jour de ces repos seraient relativement rapides : seuls les sous-modules par année modifiée seraient mis à jour, et il y a actuellement dans LEGI 50 lois/an, 1500 décrets/an, 3000 arrêtés/an. Possiblement, dans une version intégrée, les sous-modules par année pourraient être des branches du repo parent afin de tout télécharger en même temps (et non télécharger à N+1 repos) ; j’ai testé récemment avec Git 2.30, c’est possible avec une URL de sous-module de la forme "./" (et il faut que l’objet commit du sous-module soit dans le repo courant, d’où la nécessité que ce soit dans une branche ou un tag). La granularité "année" peut être changée en "mois" voire "jour" pour mettre par exemple les décrets datés du 21 juin 2020 dans le repo "décrets/2020/06/21.git" (noter que, vu le processus de consolidation, les sous-modules évolueront quelque soit la granularité vis-à-vis de leur date de publication). Plus la granularité est forte, moins chaque sous-module sera mis à jour (mais plus le téléchargement initial mettra de temps puisqu’il faudra télécharger plus de repos distincts). Un panachage du stockage peut être introduit : par exemple stockage des sous-modules par année dans le repo principal, puis téléchargement distant des sous-modules par mois. Une version plus évoluée pourrait être que, pour une granularité "mois", les 3 derniers mois sont stockés dans des branches (donc téléchargés d’office initialement) et les plus anciens sont téléchargeables au cas par cas ; dans cette configuration, cela demande côté client de changer la configuration ".git/config" puisque les branches du mois vont disparaître du repo principal avec le temps et il faudra alors les télécharger explicitement. Côté serveur, il serait possible d’utiliser les "gitnamespaces" [https://git-scm.com/docs/gitnamespaces] avec une certaine configuration nginx pour stocker efficacement ces repos dans un seul repo (ou 2 ou 3 par granularité, à tester vis-à-vis de la performance), et la performance devrait rester acceptable au moins jusqu’à une granularité du mois (250 ans x 12 mois + 250 sommaires = 3250 refs). d435f69090cd59b7770c7fac7f87cc2aa62e1a4c Tutorial:Beautiful MediaWiki URLs 102 178 658132 4236 2021-08-26T21:39:34Z Seb35 1 A retiré la protection de « [[Tutorial:Beautiful MediaWiki URLs]] » wikitext text/x-wiki {{Tutorial|lang=en|status=stable}} This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit] ''instead of'' :[{{SERVER}}/index.php?title={{FULLPAGENAMEE}}&action=edit http://{{SERVERNAME}}/index.php?title={{FULLPAGENAMEE}}&action=edit] </div> and it is even better in languages with non-latin alphabets: <div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;"> :[{{SERVER}}/维基百科?action=history http://{{SERVERNAME}}/维基百科?action=history] ''instead of'' :[{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history http://{{SERVERNAME}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history] </div> == Rationale and introduction == The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense. You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php". To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs. == Prerequisites == * [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki' * [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu) * The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>" * The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org. == MediaWiki configuration == It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is). The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory. 1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website. $wgScriptPath = <nowiki>''</nowiki>; 2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx. $wgArticlePath = '/$1'; 3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php". $wgScript = <nowiki>''</nowiki>; 4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter. $wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL'; function phpAgnosticURL( $title, &$url, $query ) { global $wgArticlePath; $url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath ); while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) { $query = $matches[1] . $matches[3]; } if ( $query != <nowiki>''</nowiki> ) { $url = wfAppendQuery( $url, $query ); } } Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…"). == Nginx configuration == 5. The basic skeleton is just below. 'location' directives will be added in the following. server { listen 80; listen 443 ssl; server_name wiki.example.org; root /var/www/mediawiki; # 'location' directives to be added thereafter } 6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts. location ~ ^/(api|load|opensearch_desc)\.php$ { include php5-fpm.conf; } 7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!). location / { if ($arg_title != <nowiki>''</nowiki>) { set_by_lua $mwredirect ' local args = ngx.var.args local arg_title = ngx.var.arg_title arg_title = ngx.re.gsub(arg_title, "%3A", ":") arg_title = ngx.re.gsub(arg_title, "%20", "_") arg_title = ngx.re.gsub(arg_title, "[+]", "_") local url = "/" .. arg_title newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo") if string.len(newargs) > 0 then url = url .. "?" ..newargs end if string.sub(url, -1) == "&" then url = string.sub(url, 1, -2) end return url '; return 301 $mwredirect; } include php5-fpm.conf; fastcgi_split_path_info ^(/)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } 8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE). location ~ ^/(extensions|skins)/ { location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ { allow all; try_files $uri =403; } deny all; } 9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private. location ~ ^/images/ { # Publicly accessible files location ~ ^/images/(\.htaccess|README|lockdir.*)$ { return 404; } location ~ /$ { deny all; } try_files $uri =404; # Private files for a private wiki #include php5-fpm.conf; #fastcgi_split_path_info ^(/images/)(.*)$; #fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php; #fastcgi_param PATH_INFO $fastcgi_path_info; } 10. To finish, we can add /robots.txt and /favicon.ico. location ~ ^/(robots.txt|favicon.ico)$ { try_files $uri =404; } == Complements == a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs. b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs. c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time). d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks: # add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org # add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files) # remove the list of files in point 9, this is probably harmless from a security point of view e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki. f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :) g. An easier way to remove most of the index.php is to use [[:mw:Manual:$wgActionPaths|$wgActionPaths]]. With this configuration setting, the 'edit' action on this page would be <tt>[{{SERVER}}/edit/{{FULLPAGENAMEE}} http://{{SERVERNAME}}/edit/{{FULLPAGENAMEE}}]</tt> instead of <tt>[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit]</tt>. I have no opinion on what is better. It can be kept in mind that some browsers might remove the address part after the "?"; in these browsers, the action would or would not be displayed. Note : how does MediaWiki react with $wgActionPaths when there are (e.g.) "action=edit" and "section=0": is it "/edit/Title?section=0" or "/index.php?title=Title&action=edit&section=0"? == Conclusion == # Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc. # Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL # The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration. # Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital). # Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files. 03570137c0bdf1de0f81eeba154fcb9ac854b005 Contributions 0 200 658137 2023-05-21T19:25:23Z Seb35 1 Contributions au logiciel libre et idées, Ajout d’une idée de contribution sur nginx wikitext text/x-wiki J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre). == Idées == === 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed === En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne : * requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas * requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed" Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''. La [https://datatracker.ietf.org/doc/html/rfc2068#section-5.1.1 RFC 2068 section 5.1.1 Method] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement. Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf). PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte. Actions à faire : # Compiler nginx sans aucun module # Re-tester # Confirmer ou non le problème # Éventuellement investiguer comment ça se comporte si on active le module dav f0048525ad687dcdb6f53516768ea49e592986d0 658138 658137 2023-05-21T19:27:39Z Seb35 1 Précision wikitext text/x-wiki J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre). == Idées == === 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed === En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne : * requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas * requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed" Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''. La [https://datatracker.ietf.org/doc/html/rfc2068#section-5.1.1 RFC 2068 section 5.1.1 Method] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement. Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf). PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte. Actions à faire : # Compiler nginx sans aucun module # Re-tester # Confirmer ou non le problème # Éventuellement investiguer comment ça se comporte si on active le module dav 9a2c8cc91408260eb99a4bebf3da92caa97590c1 658139 658138 2023-05-21T20:10:04Z Seb35 1 +idée « 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported » wikitext text/x-wiki J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre). == Idées == === 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported === En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois. Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx. Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ? Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander. === 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed === En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne : * requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas * requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed" Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''. La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement. Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf). PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte. Actions à faire : # Compiler nginx sans aucun module # Re-tester # Confirmer ou non le problème # Éventuellement investiguer comment ça se comporte si on active le module dav e4f4ed43bccd16ed14069dc056e7d8f9c34863a9 658140 658139 2023-05-21T20:32:19Z Seb35 1 /* 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed */ +1 point dans la liste d’actions à faire wikitext text/x-wiki J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre). == Idées == === 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported === En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois. Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx. Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ? Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander. === 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed === En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne : * requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas * requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed" Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''. La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement. Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf). PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte. Actions à faire : # Compiler nginx sans aucun module # Parcourir https://nginx.org/en/docs/dev/development_guide.html # Re-tester # Confirmer ou non le problème # Éventuellement investiguer comment ça se comporte si on active le module dav 03feb5aca1f69f87f5303fa7a68ed4bb4cc91977 658141 658140 2023-05-21T22:29:31Z Seb35 1 +Logiciel flus.io wikitext text/x-wiki J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre). == Logiciels == === flus.io === [https://github.com/flusio/flusio/issues/594 Issue #594 - Items en double] ouverte le 2023-05-19 - à suivre, éventuellement chercher à résoudre == Idées == === 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported === En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois. Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx. Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ? Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander. === 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed === En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne : * requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas * requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed" Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''. La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement. Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf). PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte. Actions à faire : # Compiler nginx sans aucun module # Parcourir https://nginx.org/en/docs/dev/development_guide.html # Re-tester # Confirmer ou non le problème # Éventuellement investiguer comment ça se comporte si on active le module dav 67a8e32b8ea4a1d7381fd0182624c2dce3780073 658142 658141 2023-05-22T10:48:54Z Seb35 1 /* Logiciels */ +PdfParser wikitext text/x-wiki J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre). == Logiciels == === PdfParser === [https://github.com/smalot/pdfparser/pull/600 Pull Request #600 - Fix ASCII85 decoding in a specific case] - proposé le 2023-05-02 - '''TODO 2023-05-22 : ajouter un test''' === flus.io === [https://github.com/flusio/flusio/issues/594 Issue #594 - Items en double] ouverte le 2023-05-19 - à suivre, éventuellement chercher à résoudre == Idées == === 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported === En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois. Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx. Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ? Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander. === 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed === En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne : * requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas * requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed" Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''. La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement. Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf). PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte. Actions à faire : # Compiler nginx sans aucun module # Parcourir https://nginx.org/en/docs/dev/development_guide.html # Re-tester # Confirmer ou non le problème # Éventuellement investiguer comment ça se comporte si on active le module dav f1647c57d521870e8dd134d7cfe4532b1a753646 658143 658142 2023-05-23T13:14:12Z Seb35 1 update pour l’erreur 405 de nginx wikitext text/x-wiki J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre). == Logiciels == === PdfParser === [https://github.com/smalot/pdfparser/pull/600 Pull Request #600 - Fix ASCII85 decoding in a specific case] - proposé le 2023-05-02 - '''TODO 2023-05-22 : ajouter un test''' === flus.io === [https://github.com/flusio/flusio/issues/594 Issue #594 - Items en double] ouverte le 2023-05-19 - à suivre, éventuellement chercher à résoudre == Idées == === 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported === En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois. Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx. Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ? Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander. === 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed === En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne : * requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas * requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed" Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''. La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement. Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf). PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte. ==== Actions à faire ==== # <s>Compiler nginx sans aucun module</s> # Parcourir https://nginx.org/en/docs/dev/development_guide.html # <s>Re-tester</s> # <s>Confirmer ou non le problème</s> # <s>Éventuellement investiguer comment ça se comporte si on active le module dav</s> # Par rapport au problème que j’observe (en nginx 1.14 de Debian buster), soit les nouvelles versions de nginx ont corrigé le problème, soit c’est un des modules non-encore-testé qui introduit le problème (dans les modules officiels image_filter, geoip, perl ; ou dans les modules supplémentaires auth-pam, dav-ext, echo, upstream-fair, subs-filter) ==== Compilation ==== Avec nginx 1.23.0 bddd3f76e3e5 (2023-05-23T00:45:18+04:00) <code>./auto/configure --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/tmp/nginx/usr/share/nginx --conf-path=/tmp/nginx/etc/nginx/nginx.conf --http-log-path=/tmp/nginx/var/log/nginx/access.log --error-log-path=/tmp/nginx/var/log/nginx/error.log --lock-path=/tmp/nginx/var/lock/nginx.lock --pid-path=/tmp/nginx/run/nginx.pid --modules-path=/tmp/nginx/usr/lib/nginx/modules --http-client-body-temp-path=/tmp/nginx/var/lib/nginx/body --http-fastcgi-temp-path=/tmp/nginx/var/lib/nginx/fastcgi --http-proxy-temp-path=/tmp/nginx/var/lib/nginx/proxy --http-scgi-temp-path=/tmp/nginx/var/lib/nginx/scgi --http-uwsgi-temp-path=/tmp/nginx/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-threads --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-http_addition_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-http_xslt_module</code> Il n’y a pas le problème : <code>curl -v -X DELETE 'http://127.0.0.1:8080/fichier-existant.txt'</code> et <code>curl -v -X DELETE 'http://127.0.0.1:8080/fichier-inexistant.txt'</code> retournent 405 Not Allowed (et le module dav est innocent). 9a20adf8448b2ae907f255f8095f750c48b41222 658144 658143 2023-05-23T18:33:49Z Seb35 1 le problème identifié sur nginx code 405 a probablement été corrigé dans les versions récentes wikitext text/x-wiki J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre). == Logiciels == === PdfParser === [https://github.com/smalot/pdfparser/pull/600 Pull Request #600 - Fix ASCII85 decoding in a specific case] - proposé le 2023-05-02 - '''TODO 2023-05-22 : ajouter un test''' === flus.io === [https://github.com/flusio/flusio/issues/594 Issue #594 - Items en double] ouverte le 2023-05-19 - à suivre, éventuellement chercher à résoudre == Idées == === 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported === En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois. Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx. Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ? Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander. === 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed === En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne : * requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas * requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed" Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''. La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement. Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf). PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte. ==== Actions à faire ==== # <s>Compiler nginx sans aucun module</s> # Parcourir https://nginx.org/en/docs/dev/development_guide.html # <s>Re-tester</s> # <s>Confirmer ou non le problème</s> # <s>Éventuellement investiguer comment ça se comporte si on active le module dav</s> # Par rapport au problème que j’observe (en nginx 1.14 de Debian 10 buster et 1.18 de Debian 11 bullseye, y compris après avoir retiré tous les modules dynamiques), '''l’explication la plus vraisemblable est que les nouvelles versions de nginx ont corrigé le problème (entre 1.18 et 1.23)''' ==== Compilation ==== Avec nginx 1.23.0 bddd3f76e3e5 (2023-05-23T00:45:18+04:00) <code>./auto/configure --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/tmp/nginx/usr/share/nginx --conf-path=/tmp/nginx/etc/nginx/nginx.conf --http-log-path=/tmp/nginx/var/log/nginx/access.log --error-log-path=/tmp/nginx/var/log/nginx/error.log --lock-path=/tmp/nginx/var/lock/nginx.lock --pid-path=/tmp/nginx/run/nginx.pid --modules-path=/tmp/nginx/usr/lib/nginx/modules --http-client-body-temp-path=/tmp/nginx/var/lib/nginx/body --http-fastcgi-temp-path=/tmp/nginx/var/lib/nginx/fastcgi --http-proxy-temp-path=/tmp/nginx/var/lib/nginx/proxy --http-scgi-temp-path=/tmp/nginx/var/lib/nginx/scgi --http-uwsgi-temp-path=/tmp/nginx/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-threads --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-http_addition_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-http_xslt_module</code> Il n’y a pas le problème : <code>curl -v -X DELETE 'http://127.0.0.1:8080/fichier-existant.txt'</code> et <code>curl -v -X DELETE 'http://127.0.0.1:8080/fichier-inexistant.txt'</code> retournent 405 Not Allowed (et le module dav est innocent). eacfd1bbd18b20e4693e3491ece153aad2ea0a7b 658145 658144 2023-05-27T11:18:31Z Seb35 1 /* PdfParser */ wikitext text/x-wiki J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre). == Logiciels == === PdfParser === [https://github.com/smalot/pdfparser/pull/600 Pull Request #600 - Fix ASCII85 decoding in a specific case] - proposé le 2023-05-02 - tests unitaires ajouté le 2023-05-27 === flus.io === [https://github.com/flusio/flusio/issues/594 Issue #594 - Items en double] ouverte le 2023-05-19 - à suivre, éventuellement chercher à résoudre == Idées == === 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported === En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois. Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx. Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ? Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander. === 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed === En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne : * requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas * requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed" Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''. La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement. Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf). PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte. ==== Actions à faire ==== # <s>Compiler nginx sans aucun module</s> # Parcourir https://nginx.org/en/docs/dev/development_guide.html # <s>Re-tester</s> # <s>Confirmer ou non le problème</s> # <s>Éventuellement investiguer comment ça se comporte si on active le module dav</s> # Par rapport au problème que j’observe (en nginx 1.14 de Debian 10 buster et 1.18 de Debian 11 bullseye, y compris après avoir retiré tous les modules dynamiques), '''l’explication la plus vraisemblable est que les nouvelles versions de nginx ont corrigé le problème (entre 1.18 et 1.23)''' ==== Compilation ==== Avec nginx 1.23.0 bddd3f76e3e5 (2023-05-23T00:45:18+04:00) <code>./auto/configure --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/tmp/nginx/usr/share/nginx --conf-path=/tmp/nginx/etc/nginx/nginx.conf --http-log-path=/tmp/nginx/var/log/nginx/access.log --error-log-path=/tmp/nginx/var/log/nginx/error.log --lock-path=/tmp/nginx/var/lock/nginx.lock --pid-path=/tmp/nginx/run/nginx.pid --modules-path=/tmp/nginx/usr/lib/nginx/modules --http-client-body-temp-path=/tmp/nginx/var/lib/nginx/body --http-fastcgi-temp-path=/tmp/nginx/var/lib/nginx/fastcgi --http-proxy-temp-path=/tmp/nginx/var/lib/nginx/proxy --http-scgi-temp-path=/tmp/nginx/var/lib/nginx/scgi --http-uwsgi-temp-path=/tmp/nginx/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-threads --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-http_addition_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-http_xslt_module</code> Il n’y a pas le problème : <code>curl -v -X DELETE 'http://127.0.0.1:8080/fichier-existant.txt'</code> et <code>curl -v -X DELETE 'http://127.0.0.1:8080/fichier-inexistant.txt'</code> retournent 405 Not Allowed (et le module dav est innocent). 0250151e230da255984cde5f2bfd9cfd5d194df7 Btrfs 0 189 658158 658157 2023-06-15T15:48:26Z Seb35 1 /* Scripted procedure */ wikitext text/x-wiki I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki]. WARNING: this could cause DATA LOSS, be sure you have backups (possibly Gandi snapshots). This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4. == Manual procedure == === Create the server === On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye. For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11): echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list Install btrfs-progs: apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster apt update && apt install btrfs-progs # Debian 11 bullseye On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). === Convert to btrfs === :''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]'' Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: ls /dev/xvd* mount|grep xvd blkid Copy the result of <code>blkid</code> in some text file on your computer (will be used later). Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert]) fsck.ext4 -f /dev/xvdb1 # optional btrfs-convert -p /dev/xvdb1 Here, I obtained the following error: root@test:~# btrfs-convert -p /dev/xvdb1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files) btrfs-convert -d -p /dev/xvdb1 or even: btrfs-convert -n -d -p /dev/xvdb1 Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)). Then, mount the filesystem and delete the old ext4 snapshot: mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved btrfs filesystem defrag -r /mnt # could take dozen of minuts btrfs balance start /mnt # could take hours === Promote as root filesystem === :''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]'' Edit the /etc/fstab of the btrfs system: uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab Update Grub in a chrooted system: for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt Quit: exit === Define the cooked disk as boot disk === In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)). df -hT It should show something like: /dev/xvda1 btrfs 50G 32G 19G 63% / Delete the old root disk. You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations: cp -a /etc/default/grub /root/grub apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin mv /root/grub /etc/default/grub apt-mark manual grub-common grub2-common update-grub # to check it still work and you should reboot now to be sure it reboots correctly == Scripted procedure == This script automates the conversion, with a slightly-modified procedure. On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye. On GandiV5 : # stop the server, # open the page about the system disk in Volumes, # clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"), # start the server, # wait until the server is started, # attach this cloned disk to the server. ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server). # Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>) #: The script takes about 3 minutes to convert a 1.4 GiB disk. <syntaxhighlight lang="shell"> #!/bin/sh set -e fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3` blkid=`blkid|grep -F ' LABEL="gandiroot" '` nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2` if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4' exit 2 fi fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1` fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1` echo echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)" echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)" set -v apt-get update apt-get install -y btrfs-progs fsck.ext4 -f "$fs_gandiroot_btrfs" btrfs-convert -p "$fs_gandiroot_btrfs" mount "$fs_gandiroot_btrfs" /mnt btrfs subvolume delete -C /mnt/ext2_saved btrfs filesystem defragment -r /mnt btrfs balance start /mnt new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2` sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt update-grub for i in dev/pts dev proc sys; do umount /mnt/$i; done umount /mnt </syntaxhighlight> In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start". Launch the server and execute: df -hT It should show something like: /dev/xvda1 btrfs 5G 1.4G 3.5G 28% / Delete the old root disk. == Troubleshootings == * During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults" == External links == * [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki] 563f3a9c36cc08a0bcb9def31c5aaa48b36f7ae5